none
refleccion GetMethods retorna null RRS feed

  • Pregunta

  • Hola con todos estoy en un aprieto, espero su apoyo porfavor.

    tengo una clase publica estatica con metodos que intento llamarla por refleccion

    Type type = Type.GetType("PlexOne.Business.SqlDataServer.eProduct");
    MethodInfo[] methodInfo = type.GetMethods(BindingFlags.Public | BindingFlags.Static);
    foreach (var info in methodInfo)
    {
        MessageBox.Show(info.Name);
    }
    y tengo error de nullreference : type return null

    martes, 31 de marzo de 2020 5:32

Respuestas

  • te cuento que yo tengo una solución con varios proyectos y la capa de datos es donde tengo una clase con métodos

    Entonces por eso te da un error al llamar a GetType y pasar el nombre de la clase entre comillas. Esto solo funciona cuando la clase está en el mismo ensamblado desde el que la llamas.

    Se puede resolver poniendo el "fully qualified name", que incluye el ensamblado (ver enlace más abajo). Pero es mucho más sencillo sustituirlo por typeof como te puse en un mensaje anterior.

    https://docs.microsoft.com/en-us/dotnet/api/system.type.gettype?view=netframework-4.8#System_Type_GetType_System_String_


    referencia a PlexOne.Business.SqlDataServer tiene un método eProduct

    Entonces en el Type solo tienes que poner PlexOne.Business.SqlDataServer (el nombre de la clase). El nombre del método (eProduct) te lo devuelve GetMetods, O bien si solo quieres ese método, se lo puedes pasar a GetMethod (en singular).

    martes, 31 de marzo de 2020 20:53
    Moderador

Todas las respuestas

  • ¿En cuál de las líneas exactamente ocurre el error? Por e mensaje que indicas, tengo la impresión de que no es que falle la llamada a GetMethods, sino que type es null.

    Esto indicaría que Type.GetType no ha encontrado el tipo que indicas entre comillas. Cerciórate de que ese tipo es visible para ese código (tienes cargado el assembly?) Una forma de cerciorarte de que el tipo es accesible es cambiar la línea así:

    Type type = typeof(PlexOne.Business.SqlDataServer.eProduct);

    Si eso da un error de compilación, significa que no tienes bien referenciado el ensamblado que contiene ese tipo.

    martes, 31 de marzo de 2020 8:32
    Moderador
  • hola

    >>tengo una clase publica estatica con metodos

    realice un codigo de ejemplo

    using System;
    using System.Reflection;
    					
    public class Program
    {
    	public static void Main()
    	{
    		Type type = typeof(eProduct);
    		MethodInfo[] methodInfo = type.GetMethods(BindingFlags.Public | BindingFlags.Static);
    		foreach (var info in methodInfo)
    		{
    			Console.WriteLine(info.Name);
    		}
    		
    	}
    }
    
    public class eProduct
    {
    	public static void Metodo1()
    	{
    	}
    	public static void Metodo2()
    	{
    	}
    }

    con lo cual validar que el codigo que defines funciona correctamente, quizas deberias validar como defines el Type

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 31 de marzo de 2020 14:39
  • hola

    >>tengo una clase publica estatica con metodos

    realice un codigo de ejemplo

    using System;
    using System.Reflection;
    					
    public class Program
    {
    	public static void Main()
    	{
    		Type type = typeof(eProduct);
    		MethodInfo[] methodInfo = type.GetMethods(BindingFlags.Public | BindingFlags.Static);
    		foreach (var info in methodInfo)
    		{
    			Console.WriteLine(info.Name);
    		}
    		
    	}
    }
    
    public class eProduct
    {
    	public static void Metodo1()
    	{
    	}
    	public static void Metodo2()
    	{
    	}
    }

    con lo cual validar que el codigo que defines funciona correctamente, quizas deberias validar como defines el Type

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    hola  leonardo , gracias por la pronta respuesta.

    te cuento que yo tengo una solución con varios proyectos y la capa de datos es donde tengo una clase con métodos para realizar crud en mi aplicación y quiero llamarlo por reflection para hacer dinámica la llamada de métodos en algunos eventos.

    entonces en mi proyecto de presentación que tiene referencia a PlexOne.Business.SqlDataServer tiene un método eProduct que quiero llamar por reflection con el código que te mostré y tengo el siguiente error

    

    martes, 31 de marzo de 2020 15:38
  •  no marca ningún error al compilar Type type = typeof(PlexOne.Business.SqlDataServer.eProduct);
    martes, 31 de marzo de 2020 15:41
  •  no marca ningún error al compilar Type type = typeof(PlexOne.Business.SqlDataServer.eProduct);
    Y al ejecutarlo usando esa línea para obtener el Type, ¿qué pasa cuando llama a GetMethods usando este type?
    martes, 31 de marzo de 2020 20:48
    Moderador
  • te cuento que yo tengo una solución con varios proyectos y la capa de datos es donde tengo una clase con métodos

    Entonces por eso te da un error al llamar a GetType y pasar el nombre de la clase entre comillas. Esto solo funciona cuando la clase está en el mismo ensamblado desde el que la llamas.

    Se puede resolver poniendo el "fully qualified name", que incluye el ensamblado (ver enlace más abajo). Pero es mucho más sencillo sustituirlo por typeof como te puse en un mensaje anterior.

    https://docs.microsoft.com/en-us/dotnet/api/system.type.gettype?view=netframework-4.8#System_Type_GetType_System_String_


    referencia a PlexOne.Business.SqlDataServer tiene un método eProduct

    Entonces en el Type solo tienes que poner PlexOne.Business.SqlDataServer (el nombre de la clase). El nombre del método (eProduct) te lo devuelve GetMetods, O bien si solo quieres ese método, se lo puedes pasar a GetMethod (en singular).

    martes, 31 de marzo de 2020 20:53
    Moderador
  • hola

    Si tienes una dll junto a la aplicacion analiza

    Instantiating a C# object from a string using Activator.CreateInstance in .NET

    como veras el nombre debes respectar la estructura

    "{namespace}.{class name}, "{assembly name}"

    entonces veras que usa

    const string objectToInstantiate = "SampleProject.Domain.MyNewTestClass, MyTestProject";
     
    var objectType = Type.GetType(objectToInstantiate);


    >>mi proyecto de presentación que tiene referencia a PlexOne.Business.SqlDataServer tiene un método eProduct

    Que tiene que ver el metodo eProduct? eso no se define en el GetType() solo debes indicar el nombre de la libreria para obtener la instancia y despues de esta obtienes la informacion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 31 de marzo de 2020 23:56
  • Si tienes una dll junto a la aplicacion analiza

    Instantiating a C# object from a string using Activator.CreateInstance in .NET

    No; suponiendo que sea cierto lo que decía el OP al principio en cuanto a que se trata de métodos estáticos en una clase estática, entonces CreateInstance no es aplicable.
    miércoles, 1 de abril de 2020 2:28
    Moderador