如何在.NET 4.0中检查一个通用参数是否为动态类型

11

我有一个类ObjectMapper<T>。在.NET 4.0中有没有办法告诉我typeof(T)dynamic?我想能够在成员方法内部确定该类是作为new ObjectMapper<dynamic>()还是new ObjectMapper<SomeConcreteClass>()初始化的。

2个回答

10

没有名为 dynamic 的CLR类型。 C#编译器将所有动态值作为object类型,并调用自定义绑定代码来确定如何处理它们。 如果使用了dynamic,则会显示为Object


1
是的,我可以通过调试器看到。但是有没有办法区分new ObjectMapper{object}()和new ObjectMapper{dynamic}()之间的区别? - Dmitry S.
1
不,你在代码中无法区分它们的差异,因为唯一的区别在于它们的使用方式。 - Gabe
2
我认为这是C#团队一个糟糕的设计决策,因为现在C#进入了Java领域,而反射机制无法完成某些任务。使用modopt而不是属性会是一个更好的选择。 - Daniel
@Daniel:你可以在项目级别上禁用dynamic关键字,在我看来,这对大多数C#项目来说是一件好事。 - Steven
1
Daniel:反射已经做不到某些事情了,比如模拟 Perl 的 wantarray,它可以告诉你调用者期望你返回什么类型。 - Gabe

4

您可以通过检查实例是否属于类型IDynamicMetaObjectProvider或者检查该类型是否实现了IDynamicMetaObjectProvider来完成此操作。


1
只有当您拥有对象实例时,此代码才能正常工作。typeof(T).GetInterfaces()将返回一个长度为0的数组。 - Dmitry S.
1
这段代码检查一个实例是否为动态对象,但 OP 想知道类的类型参数是否设置为 dynamic。 - Dan Bryant
1
没有动态对象:所有对象都可以通过 dynamic 引用。 - Steven Sudit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接