动态对象 - 如何判断是否定义了属性?

Ran*_*der 5 c# dynamic

我有一个动态对象,如下所示:

this.ChartDetails.Chart
Run Code Online (Sandbox Code Playgroud)

'图表'是动态的.我想查看名为LeftYAxis的图表上是否存在动态属性.在动态对象上执行此操作的最佳方法是什么?

我不认为这是如何检测ExpandoObject上是否存在属性的重复因为它没有讨论为动态对象执行此操作的最佳方法.

joe*_*dev 7

出于各种原因,最好避免使用try/catch块来控制流量.因此,当克里斯托弗的方法达到预期的结果时,我觉得这更可取:

this.ChartDetails.Chart.GetType().GetProperty("LeftYAxis") != null;
Run Code Online (Sandbox Code Playgroud)


Cri*_*ole 6

bool isDefined = false;
object axis = null;
try
{
    axis = this.ChartDetails.Chart.LeftYAxis;
    isDefined = true;
}
catch(RuntimeBinderException)
{ }
Run Code Online (Sandbox Code Playgroud)

这是在运行时首先发生的事情.(当你访问一个属性时,'动态'事物只会在对象覆盖DynamicObject's TryGetMember和' 处理第一次机会异常时发生.TrySetMember

有些对象(例如ExpandoObject)实际上是字典下的字典,您可以直接检查它们,如下所示:

bool isDefined = ((IDictionary<string, object>)this.ChartDetails.Chart)
    .ContainsKey("LeftYAxis");
Run Code Online (Sandbox Code Playgroud)

基本上:在不知道实际类型ChartDetails.Chart是什么的情况下(如果它是ExpandoObject一个普通的子类object或子类DynamicObject),除了上面的try/catch之外别无他法.如果你写的代码ChartDetailsChart或有机会获得源代码,可以判断为对象存在哪些方法和使用这些检查.