Hay tres maneras de hacer esto; el primero es usar GetGetMethod()/GetSetMethod() y crear un delegado con Delegate.CreateDelegate. El segundo es un lambda (¡no sirve de mucho para la reflexión!) [Es decir x => x.Foo]. El tercero es a través de Expression (.NET 3.5).
La lambda es la más fácil ;-P
class TestClass
{
public int Value { get; set; }
}
static void Main()
{
Func<TestClass, int> lambdaGet = x => x.Value;
Action<TestClass, int> lambdaSet = (x, val) => x.Value = val;
var prop = typeof(TestClass).GetProperty("Value");
Func<TestClass, int> reflGet = (Func<TestClass, int>) Delegate.CreateDelegate(
typeof(Func<TestClass, int>), prop.GetGetMethod());
Action<TestClass, int> reflSet = (Action<TestClass, int>)Delegate.CreateDelegate(
typeof(Action<TestClass, int>), prop.GetSetMethod());
}
para demostrar uso:
TestClass foo = new TestClass();
foo.Value = 1;
Console.WriteLine("Via property: " + foo.Value);
lambdaSet(foo, 2);
Console.WriteLine("Via lambda: " + lambdaGet(foo));
reflSet(foo, 3);
Console.WriteLine("Via CreateDelegate: " + reflGet(foo));
Tenga en cuenta que si desea que el delegado que apunta a la instancia específica, se puede utilizar para el cierre de lambda , o la sobrecarga de CreateDelegate que acepta y instancia.
Creo que esto funcionará para las necesidades que tengo. ¡Gracias! –
Dado que se supone que C# es mi primer idioma, realmente me gustaría entender esto (crear un delegado usando la reflexión) - suena genial – JohnIdol
Y para .net 2.0 se podría hacer Acción valueSetter = delegate (int value) {tc .Value = valor; } –