2011-02-25 137 views
120

也許使用動態模式?你可以使用動態關鍵字調用任何方法/屬性,對吧?例如,如何在調用myDynamicObject.DoStuff()之前檢查方法是否存在?如何檢查對象是否具有某些方法/屬性?

+0

什麼是* myDynamicObject *類型?它是從「DynamicObject」派生的類嗎? –

+0

用dynamic關鍵字聲明的東西 –

回答

180

你可以寫這樣的事情:

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

編輯:你甚至可以做一個擴展方法,並使用它像這樣

myObject.HasMethod("SomeMethod"); 
+0

GetType()將返回運行時類型? (即不是對象?) –

+2

是的,GetType()返回運行類型,而typeof()會返回對象。 – Julien

+1

根據文檔GetType()將返回「當前實例的確切運行時類型」。 – tzup

14

爲此不使用任何動態類型會更好,並讓您的類實現一個接口。然後,您可以在運行時檢查對象是否實現了該接口,並因此具有預期的方法(或屬性)。

public interface IMyInterface 
{ 
    void Somemethod(); 
} 


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

我認爲這是唯一正確的方法。

你所指的是鴨式打字,這在你已經知道該對象具有該方法但編譯器無法檢查該情況的場景中很有用。 例如,這在COM互操作場景中很有用。 (檢查this文章)

如果你想結合duck-typing和反射例如,那麼我認爲你錯過了鴨子打字的目標。

+2

如果對象可以是.NET框架提供的對象,我不能聲明它實現任何東西? –

+0

有什麼問題?您可以檢查'對象'是否是由.NET框架提供的對象,例如 –

+0

例如,您想檢查對象中是否存在「添加」方法。並且該對象可以是列表或其他一些不是IEnumerable的類 –

64
通過反射

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

類似

是方法

+0

不錯。您也可以在循環中執行GetMethod以獲取適當的定義屬性。 – Jnr

32

這是一個古老的問題,但我碰到了它。 Type.GetMethod(string name)將拋出AmbiguousMatchException如果有一種以上的方法使用該名稱,因此我們更好地處理這種情況下

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; 
    } 
} 
相關問題