2011-02-25 15 views
120

Belki dinamik desen kullanma? Dinamik anahtar kelimeyi kullanarak herhangi bir yöntemi/mülkü arayabilirsiniz, değil mi? Örneğin, myDynamicObject.DoStuff() yöntemini çağırmadan önce yöntemin var olup olmadığını nasıl kontrol edebilirim?Bir nesnenin belirli bir yönteme/özelliğe sahip olup olmadığı nasıl kontrol edilir?

+0

* myDynamicObject * türü nedir işlemek? DynamicObject'den türetilen bir sınıf mı? –

+0

nesne, .NET çerçevesi tarafından sağlanan bir nesne olabilir ve bir şey uygulamak için bildiremez miyim? –

cevap

180

yöntemler içindir:

public static bool HasMethod(this object objectToCheck, string methodName) 
{ 
    var type = objectToCheck.GetType(); 
    return type.GetMethod(methodName) != null; 
} 

Düzenleme: hatta bir uzantısı yöntemi yapmak ve bu

gibi kullanabilirsiniz
myObject.HasMethod("SomeMethod"); 
+0

GetType() çalışma zamanı türünü döndürecek? (yani nesne değil?) –

+2

evet, GetType() çalışma türünü döndürürken, typeof() öğesi nesneyi döndürür. – Julien

+1

Dokümanlara göre GetType(), "Geçerli örneğin tam çalışma zamanı" değerini döndürecektir. – tzup

14

Bunun için herhangi bir dinamik tür kullanmamak ve sınıfınızın bir arabirim oluşturmasına izin vermek daha iyi olmaz mıydı? Daha sonra, bir nesneyi bu arabirimi uygulayıp uygulamadığı ve böylece beklenen yönteme (veya özellik) sahip olduğu, çalışma zamanında kontrol edebilirsiniz.

public interface IMyInterface 
{ 
    void Somemethod(); 
} 


IMyInterface x = anyObject as IMyInterface; 
if(x != null) 
{ 
    x.Somemethod(); 
} 

Bunun tek doğru yol olduğunu düşünüyorum.

Başvuruda bulunduğunuz şey, nesnenin yönteme sahip olduğunu bildiğiniz senaryolarda yararlı olan ördek yazmasıdır, ancak derleyici bunu denetleyemez. Bu, örneğin COM birlikte çalışma senaryolarında kullanışlıdır. (check this article)

Ördek yazmayı örneğin yansımayla birleştirmek istiyorsanız, ördek tipi yazma amacını kaçırdığınızı düşünüyorum.

var property = object.GetType().GetProperty("YourProperty") 
property.SetValue(object,some_value,null); 

Benzer Yansıma yoluyla

+2

dinamik anahtar kelimesiyle bildirilen bir şey –

+0

Sorun nedir? 'Nesnenin' bir nesne olup olmadığını kontrol edebilirsiniz, örneğin .NET çerçevesi tarafından sağlanan –

+0

aynı şekilde, bir nesnede "Ekle" yönteminin olup olmadığını kontrol etmek istersiniz. Nesne, bir Liste veya IEnumerable –

64

Sen böyle bir şeyi yazabilirsiniz

+0

Güzel. Uygun tanımlı özelliği elde etmek için GetMethod'u bir döngüde de yapabilirsiniz. – Jnr

32

Bu eski bir soru, ama ben sadece içine koştum. Bu isimde birden fazla yöntem varsa Type.GetMethod(string name) bir AmbiguousMatchException fırlatır, bu yüzden daha iyi çantayı

public static bool HasMethod(this object objectToCheck, string methodName) 
{ 
    try 
    { 
     var type = objectToCheck.GetType(); 
     return type.GetMethod(methodName) != null; 
    } 
    catch(AmbiguousMatchException) 
    { 
     // ambiguous means there is more than one result, 
     // which means: a method with that name does exist 
     return true; 
    } 
} 
İlgili konular