我有一個動態的對象,如下所示:動態對象 - 如何判斷屬性是否被定義?
this.ChartDetails.Chart
「圖」是動態的。我想看看名爲LeftYAxis的Chart上是否存在動態屬性。在動態對象上執行此操作的最佳方法是什麼?
我不認爲這是How to detect if a property exists on an ExpandoObject?的重複,因爲它沒有討論爲動態對象執行此操作的最佳方法。
我有一個動態的對象,如下所示:動態對象 - 如何判斷屬性是否被定義?
this.ChartDetails.Chart
「圖」是動態的。我想看看名爲LeftYAxis的Chart上是否存在動態屬性。在動態對象上執行此操作的最佳方法是什麼?
我不認爲這是How to detect if a property exists on an ExpandoObject?的重複,因爲它沒有討論爲動態對象執行此操作的最佳方法。
bool isDefined = false;
object axis = null;
try
{
axis = this.ChartDetails.Chart.LeftYAxis;
isDefined = true;
}
catch(RuntimeBinderException)
{ }
這是在運行時首先發生的事情。 (當你訪問一個屬性的「動態」一件事情,當第一個機會異常得到由DynamicObject
的TryGetMember
和TrySetMember
某些對象的對象的覆蓋處理只發生(如ExpandoObject
)實際上是引擎蓋下字典您可以直接檢查這些如下:
bool isDefined = ((IDictionary<string, object>)this.ChartDetails.Chart)
.ContainsKey("LeftYAxis");
基本上是:在不知道什麼實際型ChartDetails.Chart
是(如果它是一個ExpandoObject
一個純醇的object
」子類或DynamicObject
一個子類)有沒有辦法除了嘗試/趕上。如果您編寫了代碼ChartDetails
和Chart
或有權訪問源代碼,則可以確定該對象存在哪些方法並使用這些方法進行檢查。
由於各種原因,最好避免用於控制流的try/catch塊。因此,雖然克里斯托弗的方法達到期望的結果,我發現這個優選的:
this.ChartDetails.Chart.GetType().GetProperty("LeftYAxis") != null;
這一個是工作 - :
public static bool IsPropertyExists(dynamic dynamicObj, string property)
{
try
{
var value=dynamicObj[property].Value;
return true;
}
catch (RuntimeBinderException)
{
return false;
}
}
這適用於如果所述動態對象是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;
}
如果this.ChartDetails.Chart.LeftYAxis!= NULL –
這是* DynamicObject你*實現? – Tigran
[如何檢測屬性是否存在於C#中的動態對象?]可能的重複?(http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a -dynamic-object-in-c) – jason