Есть три способа сделать это; во-первых, использовать GetGetMethod()/GetSetMethod() и создать делегат с Delegate.CreateDelegate. Второй - лямбда (не очень полезно для отражения!) [Т. х => x.Foo]. Третий - через выражение (.NET 3.5).
лямбда является самым простым ;-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());
}
, чтобы показать использование:
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));
Обратите внимание, что если вы хотите, делегат, указывающий на конкретный экземпляр, вы можете использовать затворы для лямбды , или перегрузка CreateDelegate, который принимает и экземпляр.
Несмотря на то, что спецификация C# резервирует методы get_P и set_P для любого свойства P, для использования этих методов для свойств не требуется реализация. Это делает его деталью реализации. Не полагайтесь на недокументированные детали реализации. – 2008-11-14 13:05:41
С помощью класса PropertyInfo и GetGet/SetMethod он больше не является проблемой реализации. В данный момент это часть структуры. – Kieron 2008-11-14 13:19:06
Kieron: достаточно справедливо. – 2008-11-14 13:31:32