2012-06-05 42 views
5

我有一個動態的對象,如下所示:動態對象 - 如何判斷屬性是否被定義?

this.ChartDetails.Chart 

「圖」是動態的。我想看看名爲LeftYAxis的Chart上是否存在動態屬性。在動態對象上執行此操作的最佳方法是什麼?

我不認爲這是How to detect if a property exists on an ExpandoObject?的重複,因爲它沒有討論爲動態對象執行此操作的最佳方法。

+0

如果this.ChartDetails.Chart.LeftYAxis!= NULL –

+0

這是* DynamicObject你*實現? – Tigran

+3

[如何檢測屬性是否存在於C#中的動態對象?]可能的重複?(http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a -dynamic-object-in-c) – jason

回答

6
bool isDefined = false; 
object axis = null; 
try 
{ 
    axis = this.ChartDetails.Chart.LeftYAxis; 
    isDefined = true; 
} 
catch(RuntimeBinderException) 
{ } 

這是在運行時首先發生的事情。 (當你訪問一個屬性的「動態」一件事情,當第一個機會異常得到由DynamicObjectTryGetMemberTrySetMember

某些對象的對象的覆蓋處理只發生(如ExpandoObject)實際上是引擎蓋下字典您可以直接檢查這些如下:

bool isDefined = ((IDictionary<string, object>)this.ChartDetails.Chart) 
    .ContainsKey("LeftYAxis"); 

基本上是:在不知道什麼實際ChartDetails.Chart是(如果它是一個ExpandoObject一個純醇的object」子類或DynamicObject一個子類)有沒有辦法除了嘗試/趕上。如果您編寫了代碼ChartDetailsChart或有權訪問源代碼,則可以確定該對象存在哪些方法並使用這些方法進行檢查。

5

由於各種原因,最好避免用於控制流的try/catch塊。因此,雖然克里斯托弗的方法達到期望的結果,我發現這個優選的:

this.ChartDetails.Chart.GetType().GetProperty("LeftYAxis") != null; 
-1

這一個是工作 - :

public static bool IsPropertyExists(dynamic dynamicObj, string property) 
     { 
      try 
      { 
       var value=dynamicObj[property].Value; 
       return true; 
      } 
      catch (RuntimeBinderException) 
      { 

       return false; 
      } 

     } 
1

這適用於如果所述動態對象是JSON /開放標準格式。

我做了兩個不同的方法助手,一個用於開放標準格式,另一個用於「標準對象」。

// Checks if object typed json or xml has a specific property 
    public static bool IsPropertyExistsOpenStandardFormat(dynamic dynamicObject, string propertyName) 
    { 
     try 
     { 
      var x = dynamicObject[propertyName]; 
      if (x != null) 
       return true; 
     } 
     catch 
     { 
      return false; 
     } 

    } 

    // Checks if standard object has a specific property 
    public static bool IsPropertyExistsStandard(dynamic dynamicObject, string propertyName) 
    { 
     return dynamicObject.GetType().GetProperty(propertyName) != null; 
    } 
相關問題