2010-04-12 7 views
17

Para crear un delegado de un método que puede utilizar el tipo de fallos de sintaxis de compilación:Crear un delegado de un captador de propiedad o método setter

private int Method() { ... } 

// and create the delegate to Method... 
Func<int> d = Method; 

Una propiedad es una envoltura alrededor de un captador y el método de selección, y Quiero crear un delegado para un método getter de propiedad. Algo así como

public int Prop { get; set; } 

Func<int> d = Prop; 
// or... 
Func<int> d = Prop_get; 

Lo que no funciona, desafortunadamente. Tengo que crear un método lambda independiente, que parece innecesario cuando el método de obtención coincide con la firma del delegado de todas formas:

Func<int> d =() => Prop; 

Para utilizar el método delegado directamente, tengo que utilizar la reflexión desagradable, que es no compila con seguridad de tipos:

// something like this, not tested... 
MethodInfo m = GetType().GetProperty("Prop").GetGetMethod(); 
Func<int> d = (Func<int>)Delegate.CreateDelegate(typeof(Func<int>), m); 

¿hay alguna manera de crear un delegado en un método de obtener la propiedad directamente de un modo de compilación de seguridad, similar a la creación de un delegado en un método normal en la parte superior, sin necesidad de utilizar una método intermedio lambda?

+0

¿Qué le pasa a la lambda? –

+0

Es un método innecesario adicional, y hace las cosas más complicadas de lo necesario, ya que el getter de propiedad ya coincide con la firma del delegado – thecoop

+0

No veo su punto aquí: un lambda no es un método de clase, sino una instancia de un delegado . Func d =() => Prop significa que mi delegado d "apunta" al acceso –

Respuesta

6

Por lo que puedo decir, ya ha anotado todas las variantes "válidas". Como no es posible direccionar explícitamente un getter o un setter en un código normal (sin reflejo, claro), no creo que haya una forma de hacer lo que quiera.

+1

No hay forma de que el compilador obtenga un MethodInfo para un método getter de propiedad usando una referencia directa en el código? :( – thecoop

+1

Bueno, lo único que puedo pensar que debería funcionar es mediante lambda y el árbol de expresiones. Pero eso también requiere algún código auxiliar para analizar el árbol de expresiones. Consulte http://msdn.microsoft.com/en-us/library /bb397951.aspx y http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.aspx – Lucero

0

Otra opción (en .NET 3.0 y posterior) sería utilizar un DependencyProperty en lugar de una propiedad tradicional. A continuación, puede pasar el objeto DependencyProperty (en lugar de pasar por un delegado) y llamar al GetValue() o SetValue() cuando sea necesario.

(Sí, sé que esto es una cuestión de edad, pero era uno de los puestos más altos cuando yo estaba tratando de hacer algo muy similar.)

Cuestiones relacionadas