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

时间:2012-06-05 14:53:38

标签: c# dynamic

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

this.ChartDetails.Chart

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

我认为这不是How to detect if a property exists on an ExpandoObject?的副本,因为它没有讨论为动态对象执行此操作的最佳方法。

4 个答案:

答案 0 :(得分:6)

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

这是在运行时首先发生的事情。 (当您访问某个属性时,只有在对象覆盖DynamicObject的{​​{1}} TryGetMemberTrySetMember

处理第一次机会异常时才会发生'动态'事情。

某些对象(如ExpandoObject)实际上是字典下的字典,您可以按如下方式直接检查它们:

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

基本上:不知道实际类型ChartDetails.Chart是什么(如果它是ExpandoObject的{​​{1}}的子类object或{{1}的子类除了上面的try / catch之外没有办法。如果您编写了DynamicObjectChartDetails的代码或者可以访问源代码,则可以确定该对象存在哪些方法并使用这些方法进行检查。

答案 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;
           }

       }