2010-04-12 93 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()

(是的,我知道這是一個老問題,但它是當我試圖做一些非常相似的高層職位之一。)