2016-01-20 118 views
2

我想攔截對動態類型的調用,以避免在調用的方法或屬性不存在時發生RuntimeBinderException。 例如:攔截動態調用以避免RuntimeBinderException

class Foo { 
    bool IsFool{ get; set; } 
} 
... 
dynamic d = new Foo(); 
bool isFool = d.IsFoo; //works fine 
bool isSpecial = d.IsSpecial; //RuntimeBinderException 

我想要做的就是調用時要麼創建不存在的屬性,或者只是返回null。

編輯:我想要做的項目是配置文件閱讀器。所以我希望這樣做可以避免做一個嘗試抓取或檢查是否存在配置文件的每個屬性。

回答

3

我沒有看到比try .. catch塊處理像

try 
{ 
    bool isSpecial = d.IsSpecial; 
    return isSpecial; 
} 
catch(RuntimeBinderException) 
{ 
    // do something else 
    return false; 
} 

(OR)在使用後命名System.Reflection

 bool isSpecial = typeof(Foo) 
         .GetProperties() 
         .Select(p => p.Name == "IsSpecial").Count() > 0 
         ? d.IsSpecial : false; 

根據您編輯的任何特殊的方式;不知道如何優雅,這將是,但你可以在App.Config定義AppSetting元素或Web.Config文件中像

<configuration> 
    <appSettings> 
    <add key="IsFool" value="Foo"/> 
    <add key="Display" value="Foo"/> 
    </appSettings> 
</configuration> 

然後可以讀取,以驗證該成員是否存在,然後調用相應

 dynamic d = new Foo(); 

     bool isSpecial = System.Configuration.ConfigurationManager.AppSettings 
         .AllKeys.Contains("IsSpecial") 
         ? d.IsSpecial : false; 
+0

謝謝你,但這種方式失敗的主要目的是爲了讓代碼更容易編寫和閱讀。 – dcidral

+0

@dcidral,提出了兩個選擇;要麼使用'try .. catch'塊或使用反射。請參閱編輯答案。 – Rahul

+0

@dcidral,檢查編輯的答案,如果這有所幫助。 – Rahul

1

例外通常需要花費很多時間嘗試檢查屬性是否存在:

public static bool HasProperty(this object obj, string propertyName) 
{ 
    return obj.GetType().GetProperty(propertyName) != null; 
}