2010-10-20 38 views
5

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

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

感谢, 埃里克

+0

由于性能影响,您不想使用反射,但很乐意使用* dynamic *? – 2010-10-20 17:39:35

+0

@Kirk:Dynamic的表现令人惊讶。这比访问会员的反思要快得多... – 2010-10-20 17:49:13

+1

你认为*他们会对性能产生影响,或者你知道*?设计决策更适合于事实。 – smirkingman 2010-10-20 19:30:26

回答

2

dynamic类型中,反射实际上不会工作(您期望的方式)。您需要检查IDynamicMetaObjectProvider,然后使用其方法确定该类型上是否有成员。

问题是,dynamic类型在运行时添加新成员是完全可以接受的。有关示例,请参阅ExpandoObject。这不仅增加了对集合运算的新成员,但你可以很容易,做一个动态类型,它总是返回一个有效成员,不管是什么传递给它,即:

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

这可以这样做覆盖get访问器,并使其始终有效。在这种情况下,反射将无法确定此处会起什么作用......

+0

里德,这是我需要的答案,但我决定采取尝试它的方法并让异常抛出。谢谢! – 2010-10-22 18:16:12

2

我想看看这个问题有点不同。如果您使用dynamic的对象,则属性是否可以通过反射访问是无关紧要的。只有通过dynamic才可以访问它们。那么,为什么不仅仅使用这些属性来捕捉由于他们的缺陷而导致的错误呢?

+0

从我+1 - 这将是我的做法。只需使用该对象,并将异常处理为/如果他们来了。 – 2010-10-20 17:51:52

+0

@ Reed,恭喜100K! – JaredPar 2010-10-20 17:52:52

+0

谢谢!刚刚通过它今天早上:D – 2010-10-20 17:55:25

相关问题