2010-04-12 82 views
17

委托要创建一个委托从一个方法,你可以使用编译类型安全的语法:创建一个从属性的getter和setter方法

private int Method() { ... } 

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

属性是围绕一个getter和setter方法的包装,和我想创建一个委托给属性getter方法。类似于

public int Prop { get; set; } 

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

不幸的是,这不起作用。我要创建一个单独的拉姆达方法,它似乎是不必要当吸气剂的方法相匹配的委托签名反正:

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

为了直接使用委托方法,我已经使用讨厌反射,这是不编译类型安全:

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

是否有直接编译安全的方式创建一个属性获取方法的委托,类似于创建在顶部有一个正常的方法的委托的任何方式,而无需使用中间的lambda方法?

+0

什么是与拉姆达回事? – 2010-04-12 11:33:11

+0

这是一个额外的不必要的方法,并且使事情比所需要的更复杂,因为属性获得者已经与代理签名匹配 – thecoop 2010-04-12 11:52:16

+0

我在这里看不到你的观点:lambda不是类方法,而是实例化委托的一种方法。 Func d =()=> Prop表示我希望我的委托d“指向”访问者 – 2010-04-12 12:19:35

回答

6

据我所知,你已经写下了所有“有效”的变体。由于不可能在普通代码中明确提出getter或setter(没有反射,那就是),我认为没有办法做到你想要的。

+1

没有办法让编译器在代码中使用直接引用来获取属性getter方法的MethodInfo? :( – thecoop 2010-04-12 11:54:24

+1

那么,我能想到的只有通过lambda和表达式树,但是这也需要一些帮助程序代码来分析表达式树,参见http://msdn.microsoft.com/en-us/library /bb397951.aspx和http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.aspx – Lucero 2010-04-12 12:09:43

0

另一种选择(在.NET 3.0和更高版本中)将使用DependencyProperty而不是传统属性。然后,您可以绕过DependencyProperty对象(而不是绕过代表),并在需要时致电GetValue()SetValue()

(是的,我知道这是一个老问题,但它是当我试图做一些非常相似的高层职位之一。)