Estoy intentando crear Delegate para leer/escribir propiedades de tipo desconocido de clase en tiempo de ejecución.CreateDelegate con tipos desconocidos
que tienen una clase genérica Main<T>
y un método que tiene el siguiente aspecto:
Delegate.CreateDelegate(typeof(Func<T, object>), get)
donde get
es una MethodInfo
de la propiedad que debe ser leído. El problema es que cuando la propiedad devuelve int
(supongo que esto sucede para los tipos de valor) el código anterior arroja ArgumentException porque el método no puede vincularse. En caso de cadena, funciona bien.
para resolver el problema He cambiado el código para que corresponda tipo de delegado se genera mediante el uso de MakeGenericType
. Así que ahora el código es:
Type func = typeof(Func<,>);
Type generic = func.MakeGenericType(typeof(T), get.ReturnType);
var result = Delegate.CreateDelegate(generic, get)
El problema ahora es que la instancia creada delegado de generic
por lo que tiene que utilizar DynamicInvoke
que sería tan lento como el uso de la reflexión pura de leer el campo.
Así que mi pregunta es por qué el primer fragmento de código falla con los tipos de valores. De acuerdo con MSDN que debería funcionar, ya que dice que
El tipo de retorno de un delegado es compatible con el tipo de retorno de un método si el tipo de retorno del método es más restrictivo que el tipo de retorno del delegado
y cómo ejecutar el delegado en el segundo fragmento para que sea más rápido que la reflexión.
Gracias.
Muchas gracias, funcionó! – Giorgi