ventajas usar tipos tipo runtimebinderexception runtimebinder puede programacion microsoft los invocar hilos funcionan funcion eventos ejemplos delegados delegado csharp concepto como c# .net

c# - usar - tipos de delegates



¿Hay un delegado disponible para las propiedades en C#? (3)

Hay tres formas de hacer esto; el primero es usar GetGetMethod () / GetSetMethod () y crear un delegado con Delegate.CreateDelegate. El segundo es un lambda (¡no se usa 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 mostrar el 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 apunte a la instancia específica, puede usar cierres para la lambda o la sobrecarga de CreateDelegate que acepta y la instancia.

Dada la siguiente clase:

class TestClass { public void SetValue(int value) { Value = value; } public int Value { get; set; } }

puedo hacer

TestClass tc = new TestClass(); Action<int> setAction = tc.SetValue; setAction.Invoke(12);

lo cual es bueno ¿Es posible hacer lo mismo usando la propiedad en lugar del método? Preferiblemente con algo incorporado a .net.


Las propiedades son realmente envoltorios alrededor de los métodos en .Net, por lo que utilizando la reflexión debería ser capaz de obtener el delegado (set_PROPERTY y get_PROPERTY) y luego ejecutarlos ...

Ver System.Reflection.PropertyInfo

Si tiene dos métodos que puede usar para obtener / establecer el valor: GetGetMethod y GetSetMethod.

Entonces podrías escribir:

var propertyInfo = typeof (TestClass).GetProperty ("Value"); var setMethod = property.GetSetMethod (); // This will return a MethodInfo class.


Podrías crear el delegado usando la reflexión:

Action<int> valueSetter = (Action<int>)Delegate.CreateDelegate(typeof(Action<int>), tc, tc.GetType().GetProperty("Value").GetSetMethod());

o crea un delegado a un método anónimo que establece la propiedad;

Action<int> valueSetter = v => tc.Value = v;

Editar: se utilizó sobrecarga incorrecta para CreateDelegate (), necesita usar la que toma y objeta como objetivo. Fijo.