c# reflection delegates primitive value-type

C#usando propiedades con tipos de valores con Delegate.CreateDelegate



reflection delegates (1)

Usando el artículo de Jon Skeet Haciendo volar la reflexión y explorando a los delegados como una guía, estoy tratando de usar el método Delegate.CreateDelegate para duplicar propiedades como delegados. Aquí hay una clase de ejemplo:

public class PropertyGetter { public int Prop1 {get;set;} public string Prop2 {get;set;} public object GetPropValue(string propertyName) { var property = GetType().GetProperty(propertyName).GetGetMethod(); propertyDelegate = (Func<object>)Delegate.CreateDelegate(typeof(Func<object>), this, property); return propertyDelegate(); } }

El problema que tengo es cuando llamo a GetPropValue y paso "Prop1" como parámetro, obtengo una ArgumentException en la llamada a Delegate.CreateDelegate con el mensaje "Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type." Esto ocurre cuando se usa cualquier propiedad que devuelva un tipo de primitiva / valor que incluya estructuras.

¿Alguien sabe una forma de poder usar ambos tipos de referencia y valor aquí?


Fundamentalmente, su enfoque general no es posible. La razón por la que puede tomar todos los tipos sin valor y tratarlos como un Func<object> es confiar en la contravariancia ( Func<T> es contravariante con respecto a T ). Según las especificaciones del lenguaje, la contravariancia no admite tipos de valores.

Por supuesto, el problema es más fácil si simplemente no confía en usar ese enfoque.

Si solo desea obtener el valor, use el método PropertyInfo.GetValue :

public object GetPropValue(string name) { return GetType().GetProperty(name).GetValue(this); }

Si desea devolver un Func<object> que recuperará el valor cada vez que se llame, simplemente cree un lambda alrededor de esa llamada de reflexión:

public Func<object> GetPropValue2(string name) { return () => GetType().GetProperty(name).GetValue(this); }