我创建了一个继承DynamicObject
并希望创建一个静态方法的类,该方法可以创建具有预定属性(存储在中Dictionary
)的新实例。
public class CustomDynamic : DynamicObject
{
protected Dictionary<string, object> InnerDictionary;
public static T Create<T>(Dictionary<string, object> dictionary) where T : CustomDynamic , new()
{
return new T
{
InnerDictionary = dictionary
};
}
}
用法:
dynamic d = new Dictionary<string, object>();
var realPlayer = CustomDynamic.Create<Player>(d as Dictionary<string, object>);
var dynaPlayer = CustomDynamic.Create<Player>(d);
realPlayer // Player type according to VS2013
dynaPlayer // dynamic type according to VS2013
由于只有一个方法签名,为什么传递动态返回一个动态对象?还是实际上只是Visual Studio 2013变得困惑?
这是因为几乎所有涉及动态值的操作都会在执行时动态解析。对于在编译时实际上只有一种方法的情况也没有例外。这种语言更简单。(对于某些调用,编译器确实会在编译时执行足够的分辨率,以确保至少有一种方法具有适当数量的参数-这是在C#5规范的7.5.4节中指定的,但是没有影响有效收益类型。)
根据C#5规范的第7.6.5节:
如果满足以下至少一项条件,则动态绑定一个Invocation-Expression:
- 的基本表达式具有编译时类型
dynamic
。- 可选参数列表的至少一个参数具有编译时类型
dynamic
,并且主表达式没有委托类型。在这种情况下,编译器将invocation-expression分类为type的值
dynamic
。[...]
有一些涉及动态值的操作仍然具有非动态整体类型。例如:
d is Foo
总是 bool
d as Foo
总是 Foo
new Foo(d)
Foo
即使在执行时确定要使用的确切构造函数,也总是但是任何方法调用都被视为返回类型为dynamic
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句