我有一个动态对象,如下所示:
this.ChartDetails.Chart
'图表'是动态的。我想查看名为LeftYAxis的图表上是否存在动态属性。在动态对象上执行此操作的最佳方法是什么?
我认为这不是How to detect if a property exists on an ExpandoObject?的副本,因为它没有讨论为动态对象执行此操作的最佳方法。
答案 0 :(得分:6)
bool isDefined = false;
object axis = null;
try
{
axis = this.ChartDetails.Chart.LeftYAxis;
isDefined = true;
}
catch(RuntimeBinderException)
{ }
这是在运行时首先发生的事情。 (当您访问某个属性时,只有在对象覆盖DynamicObject
的{{1}} TryGetMember
和TrySetMember
某些对象(如ExpandoObject
)实际上是字典下的字典,您可以按如下方式直接检查它们:
bool isDefined = ((IDictionary<string, object>)this.ChartDetails.Chart)
.ContainsKey("LeftYAxis");
基本上:不知道实际类型ChartDetails.Chart
是什么(如果它是ExpandoObject
的{{1}}的子类object
或{{1}的子类除了上面的try / catch之外没有办法。如果您编写了DynamicObject
和ChartDetails
的代码或者可以访问源代码,则可以确定该对象存在哪些方法并使用这些方法进行检查。
答案 1 :(得分:6)
出于各种原因,最好避免使用try / catch块来控制流量。因此,当克里斯托弗的方法达到预期的结果时,我觉得这更可取:
this.ChartDetails.Chart.GetType().GetProperty("LeftYAxis") != null;
答案 2 :(得分:1)
如果动态对象是json / open-standard格式,则此Works。
我为开放标准格式制作了两个不同的方法助手,为标准对象&#34;制作了一个用于#34;。
// 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;
}
答案 3 :(得分:-1)
这个正在运作 - :
public static bool IsPropertyExists(dynamic dynamicObj, string property)
{
try
{
var value=dynamicObj[property].Value;
return true;
}
catch (RuntimeBinderException)
{
return false;
}
}