2010-04-12 7 views
17

bir temsilci oluşturun: Mülk, bir alıcı ve ayarlayıcı yöntemin etrafında sarıcıEğer derleme tip-güvenli sözdizimini kullanabilirsiniz bir yöntem bir temsilci oluşturmak için bir özellik alıcı ya da ayarlayıcı yöntemiyle

private int Method() { ... } 

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

ve Bir özellik getter yöntemine bir temsilci oluşturmak istiyorum. Maalesef ne işe yaramıyor?

Ben alıcı yöntemi zaten temsilci imza eşleştiğinde gereksiz görünüyor ayrı lambda yöntemi, oluşturmak zorunda:

doğrudan temsilci yöntemini, ben derlemek değil kötü yansıma kullanmak zorunda kullanmak için
Func<int> d =() => Prop; 

tip-güvenli:

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

doğrudan derleme güvenli bir şekilde üstünde normal bir yöntem üzerinde bir temsilci oluşturma benzer bir özellik elde yöntem üzerinde bir temsilci oluşturma herhangi bir yolu var mı, bir kullanmak gerek kalmadan ara lambda yöntemi?
+0

lambda nesi var? –

+0

Ekstra gereksiz bir yöntemdir ve gerekenden daha karmaşık hale getirir, çünkü mülk sahibi zaten zaten delegenin imzasıyla eşleştiğinde – thecoop

+0

Burada noktanızı göremiyorum: bir lambda bir sınıf yöntemi değil, bir temsilci başlatmak için bir yoldur . Func d =() => Prop, d temsilcisimin –

cevap

6

Anlatabildiğim kadarıyla, tüm "geçerli" varyantları önceden yazdınız. Bir kodlayıcıyı veya ayarlayıcıyı normal kodda açıkça belirtmek mümkün olmadığından (yansıma olmadan), istediğiniz şeyi yapmak için bir yol olduğunu düşünmüyorum.

+1

Derleyici kodda doğrudan başvuru kullanarak bir özellik getter yöntemi için bir MethodInfo almak için yolu yok mu? :( – thecoop

+1

Peki, çalışabileceği düşünebilen tek şey, lambda ve ifade ağacı yoluyla gerçekleşir.Ama bu aynı zamanda, ifade ağacını analiz etmek için bazı yardımcı kodlar gerektirir. Bkz. Http://msdn.microsoft.com/en-us/library /bb397951.aspx ve http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.aspx – Lucero

0

Başka bir seçenek (.NET 3.0 ve sonraki sürümlerde), geleneksel bir özellik yerine DependencyProperty kullanmak olacaktır. Ardından, DependencyProperty nesnesini (bir temsilci etrafından geçmek yerine) geçirebilir ve gerektiğinde GetValue() veya SetValue() numaralı telefonu arayabilirsiniz.

(Evet, bu eski bir soru olacak ama ben çok benzer bir şey yapmaya çalışıyordu yüksek mevkilerde biriydi.)

İlgili konular