6

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

this.ChartDetails.Chart

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

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

4

4 回答 4

7

出于各种原因,最好避免控制流的 try/catch 块。因此,虽然克里斯托弗的方法达到了预期的结果,但我发现这更可取:

this.ChartDetails.Chart.GetType().GetProperty("LeftYAxis") != null;
于 2014-03-03T20:50:29.833 回答
6
bool isDefined = false;
object axis = null;
try
{
    axis = this.ChartDetails.Chart.LeftYAxis;
    isDefined = true;
}
catch(RuntimeBinderException)
{ }

这首先是在运行时发生的。(当您访问一个属性时,“动态”部分仅在对象覆盖DynamicObject'sTryGetMemberTrySetMember

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

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

基本上:在不知道实际类型ChartDetails.Chart是什么的情况下(如果它是ExpandoObject一个普通的 ol' 子类object或 的子类DynamicObject),除了上面的 try/catch 之外别无他法。如果您为源代码编写了代码ChartDetails并且Chart/或者可以访问源代码,您可以确定对象存在哪些方法并使用这些方法进行检查。

于 2012-06-05T15:08:09.150 回答
1

如果动态对象是 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;
    }
于 2016-10-24T04:41:12.277 回答
-1

这个正在工作-:

public static bool IsPropertyExists(dynamic dynamicObj, string property)
       {
           try
           {
               var value=dynamicObj[property].Value;
               return true;
           }
           catch (RuntimeBinderException)
           {

               return false;
           }

       }
于 2015-06-30T12:18:49.240 回答