【问题标题】:Is Reflection the best way to determine the presense/absence of property/method on a dynamic object?反射是确定动态对象上是否存在属性/方法的最佳方法吗?
【发布时间】:2012-09-14 08:37:07
【问题描述】:

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

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

谢谢, 埃里克

【问题讨论】:

  • 由于性能影响,您不想使用反射,但乐于使用 dynamic
  • @Kirk:Dynamic 实际上表现得非常好。访问成员比反射快很多...
  • 认为它们会对性能产生影响,或者您知道?设计决策最好根据事实做出。

标签: c# dynamic language-features


【解决方案1】:

反射在dynamic 类型上实际上不起作用(如您所期望的那样)。您需要检查IDynamicMetaObjectProvider,然后使用它的方法来确定该类型上是否有可用的成员。

问题是dynamic 类型在运行时添加新成员是完全可以接受的。例如,请参阅ExpandoObject。它只在集合操作中添加新成员,但您可以轻松地创建一个始终返回有效成员的动态类型,无论传递给它的是什么,即:

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

这可以通过覆盖 get 访问器来完成,并让它们始终有效。在这种情况下,反射将无法判断这里会发生什么......

【讨论】:

  • Reed,这是我需要的答案,但我决定采取尝试并让异常被抛出的方法。谢谢!
【解决方案2】:

我会以不同的方式看待这个问题。如果您使用带有dynamic 的对象,那么这些属性是否可以通过反射访问是无关紧要的。只有可以通过dynamic 访问它们才重要。那么为什么不直接使用这些属性并捕获它们的缺失会导致的执行呢?

【讨论】:

  • +1 来自我 - 这将是我的方法。只需使用该对象,并在异常出现时处理它们。
  • 谢谢!今天早上刚通过:D
  • 贾里德,我认为你是对的。我总是尽量避免异常,但这可能是一个很好的使用案例,因为缺少属性或方法确实应该是一个例外情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2011-05-24
  • 1970-01-01
  • 2011-03-20
  • 2012-04-02
  • 2020-08-12
  • 1970-01-01
相关资源
最近更新 更多