代码之家  ›  专栏  ›  技术社区  ›  Erick T

反射是否是确定动态对象上存在/不存在属性/方法的最佳方法?

  •  5
  • Erick T  · 技术社区  · 14 年前

    我有许多接受动态对象参数(即动态foo)的数据访问方法。由于存在代码,我无法使用接口定义输入参数的类型。我正在数据访问方法中设置属性,但是在不检查属性/方法是否存在的情况下使用动态属性会让我感到紧张。

    因此,我正在寻找一种方法来检查动态对象的运行时属性/方法,但是由于性能的影响,我不想使用反射。有没有其他/推荐的方法来查询动态对象的属性/方法?

    谢谢, 埃里克

    2 回复  |  直到 12 年前
        1
  •  2
  •   Reed Copsey    14 年前

    反省其实不起作用(如你所期望的那样) dynamic 类型。你需要检查一下 IDynamicMetaObjectProvider ,然后使用其方法确定成员是否可用于该类型。

    问题是它完全可以被 动态 键入以在运行时添加新成员。例如,请参见 ExpandoObject . 它只在set操作中添加新成员,但您也可以轻松地创建一个始终返回有效成员的动态类型,无论传入的是什么,即:

    dynamic myType = new DynamicFoo();
    Console.WriteLine(myType.Foo);
    Console.WriteLine(myType.Bar);
    Console.WriteLine(myType.Baz);
    

    这可以通过重写get访问器来实现,并且只需使它们始终有效。在这种情况下,反射将无法分辨在这里会起什么作用…

        2
  •  2
  •   JaredPar    14 年前

    我会用不同的眼光看待这个问题。如果将对象用于 dynamic 那么,属性是否可以通过反射来访问是无关的。只有通过 动态 . 那么,为什么不直接使用这些属性并捕获它们的脓肿所导致的异常呢?