2011-01-31 20 views
5

Bu yansıma olmadan yansıma olmadan mümkün mü? Bu, PHP'de Wordpress'te olduğu gibi çok sık kullanılan bir şeydir. Sözde koddaC# yöntemini yalnızca varsa nasıl çağırılır?

şey:

if (exists(object.method)) {object.method} 

veya

try {object.method} finally {...} 
+0

sen demek istiyorsunuz ne –

+1

Yansıma ile bile, yöntemin prototipini hesaba katmanız gerekir: 'int Foo (dize çubuğu)', çift Foo (int bar, IDictionary quux) 'ile aynı değildir. –

+1

Kısmi yöntemleri mi arıyorsunuz? http://msdn.microsoft.com/en-us/library/6b0scde8.aspx – Ani

cevap

6

Sen dinamiklerini kullanabilir ve Runtime durum yakalamak olabilir:

dynamic d = 5; 
try 
{ 
    Console.WriteLine(d.FakeMethod(4)); 
} 
catch(RuntimeBinderException) 
{ 
    Console.WriteLine("Method doesn't exist"); 
} 

daha çok bir tasarım problemi gibi geliyor rağmen.

Yasal Uyarı
Bu kod kullanımı için değil, yapılabilir bu sadece bir örnek. dynamic ile

+0

Örnek kod Dinamiği bilmiyorum? – user310291

+0

istediğim gibi görünüyor. – user310291

+13

Akış kontrolü için istisnalar kullanmak kötü, Nasty, NASTY. – jason

16

Eh, o zaman bir arayüzde beyan ve verebilir kullanın: Yapabileceğiniz varsayar

IFoo foo = bar as IFoo; 
if (foo != null) 
{ 
    foo.MethodInInterface(); 
} 

Nesnenin gerçek türü, ancak arayüzü uygular. Aksi takdirde yansıma AFAIK kullanmanız gerekir.

(Düzeltme:. Başka yerde söz dinamik yazarak tabii ki, çok .NET 4 üzerinde çalışmak ... ama bunun için bir istisna yakalamak IMO oldukça berbat bir olurdu)

+2

+1 Bir arabirim kullanmak en temiz yoldur – Rauhotz

+0

Bu mümkün değilse olası bir performans optimizasyonu, yansımayı bir kez kullanmak ve gelecekteki çağrıları optimize etmek için dinamik bir yöntem oluşturmak olacaktır. – Mehrdad

+0

Kullanmak istediğim bağlamda çok ağır: Her bir yöntem için bir arayüz oluşturmam gerekirse, 50 yöntemden yaklaşık bir tanesi ... – user310291

1

Önce varlığını revize edilmelidir. MethodInfo[] myArrayMethodInfo = myType.GetMethods();

4

C# 4.0 yazmanız size böyle bir şey yapabileceğini:

dynamic obj = GetDynamicObject(); 
if (obj != null && obj.GetType().GetMethod("DoSomething") != null) 
{ 
    obj.DoSomething(); 
} 

Ama bir tür ilk etapta bir yöntem yansıma kullanmaktır sahip olmadığını söylemek için tek yol; Bu yüzden yukarıdaki yaklaşım size hiçbir şey satın almaz (MethodInfo'u GetMethod numaralı telefondan ve sadece Invoke numaralı telefondan alabilirsiniz).

Edit: Orada değilken bile yöntemi çağırmaya açıksanız, Yuriy's answer muhtemelen sizin aradığınız şeydir. Orijinal cevabınız, sorunuzu doldurulan şeye doğru bir yanıttı: " varsa, C# yöntemi 'u nasıl çağırırsınız."

1

Bu sorunun cevabını aradım ama hiçbir çözümü beğenmedim. Burada

benimdir: "o varsa yalnızca"

//Invoke the refresh method if the datasource contains it 
if (this.DataSource.GetType().GetMethod("Refresh") != null) 
    this.DataSource.GetType().GetMethod("Refresh").Invoke(this.DataSource, new object[] { }); 
İlgili konular