【问题标题】:Dynamic Object - How to tell if a property is defined?动态对象 - 如何判断属性是否已定义?
【发布时间】:2012-06-09 14:33:54
【问题描述】:

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

this.ChartDetails.Chart

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

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

【问题讨论】:

  • 如果 this.ChartDetails.Chart.LeftYAxis != null
  • 这是你的 DynamicObject 的实现吗?
  • @JohnGathogo - 那行不通。当对象不存在时会抛出异常。
  • 我尝试了@JohnGathogo 发布的方法,效果很好。什么情况下会导致抛出异常?

标签: c# dynamic


【解决方案1】:
bool isDefined = false;
object axis = null;
try
{
    axis = this.ChartDetails.Chart.LeftYAxis;
    isDefined = true;
}
catch(RuntimeBinderException)
{ }

这首先是在运行时发生的。 (当您访问一个属性时,只有在第一次机会异常被DynamicObjectTryGetMemberTrySetMember 的对象覆盖处理时,才会发生“动态”的事情

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

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

基本上:不知道 实际 类型 ChartDetails.Chart 是什么(如果它是 ExpandoObject 的普通 ol' 子类 objectDynamicObject 的子类)除了尝试/赶上上面。如果您为ChartDetailsChart 编写了代码,或者可以访问源代码,您可以确定对象存在哪些方法并使用这些方法进行检查。

【讨论】:

    【解决方案2】:

    出于各种原因,最好避免控制流的 try/catch 块。因此,虽然 Christopher 的方法达到了预期的效果,但我认为这更可取:

    this.ChartDetails.Chart.GetType().GetProperty("LeftYAxis") != null;
    

    【讨论】:

      【解决方案3】:

      这个正在工作-:

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

      【讨论】:

        【解决方案4】:

        如果动态对象是 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;
            }
        

        【讨论】:

          猜你喜欢
          • 2010-09-10
          • 1970-01-01
          • 2013-05-09
          • 2019-03-17
          • 2011-04-14
          • 2010-12-26
          • 2012-03-06
          • 2013-08-20
          • 2013-10-18
          相关资源
          最近更新 更多