我有一个动态对象,如下所示:
this.ChartDetails.Chart
“图表”是动态的。我想查看 Chart 上是否存在名为 LeftYAxis 的动态属性。在动态对象上执行此操作的最佳方法是什么?
我不认为这是如何检测 ExpandoObject 上是否存在属性的副本?因为它没有讨论对动态对象执行此操作的最佳方法。
我有一个动态对象,如下所示:
this.ChartDetails.Chart
“图表”是动态的。我想查看 Chart 上是否存在名为 LeftYAxis 的动态属性。在动态对象上执行此操作的最佳方法是什么?
我不认为这是如何检测 ExpandoObject 上是否存在属性的副本?因为它没有讨论对动态对象执行此操作的最佳方法。
出于各种原因,最好避免控制流的 try/catch 块。因此,虽然克里斯托弗的方法达到了预期的结果,但我发现这更可取:
this.ChartDetails.Chart.GetType().GetProperty("LeftYAxis") != null;
bool isDefined = false;
object axis = null;
try
{
axis = this.ChartDetails.Chart.LeftYAxis;
isDefined = true;
}
catch(RuntimeBinderException)
{ }
这首先是在运行时发生的。(当您访问一个属性时,“动态”部分仅在对象覆盖DynamicObject
'sTryGetMember
和TrySetMember
有些对象(如ExpandoObject
)实际上是引擎盖下的字典,您可以按如下方式直接检查它们:
bool isDefined = ((IDictionary<string, object>)this.ChartDetails.Chart)
.ContainsKey("LeftYAxis");
基本上:在不知道实际类型ChartDetails.Chart
是什么的情况下(如果它是ExpandoObject
一个普通的 ol' 子类object
或 的子类DynamicObject
),除了上面的 try/catch 之外别无他法。如果您为源代码编写了代码ChartDetails
并且Chart
/或者可以访问源代码,您可以确定对象存在哪些方法并使用这些方法进行检查。
如果动态对象是 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;
}
这个正在工作-:
public static bool IsPropertyExists(dynamic dynamicObj, string property)
{
try
{
var value=dynamicObj[property].Value;
return true;
}
catch (RuntimeBinderException)
{
return false;
}
}