WEB开发网
开发学院软件开发C语言 C#动静结合编程之三:Duck Typing 阅读

C#动静结合编程之三:Duck Typing

 2009-03-26 08:20:24 来源:WEB开发网   
核心提示: C#4.0的味道如何?很爽吗?不过,说实在的,C#动静结合编程之三:Duck Typing(4),我觉得有点儿不太舒服了!仔细想想,它像接口,在C#2.0时代也可以这样:object jsonObj = CreateFromJson(@"{ ""FirstNa

C#4.0的味道如何?很爽吗?不过,说实在的,我觉得有点儿不太舒服了!仔细想想,它像接口,像委托,还是更像HTTP + XML? 对于dynamic对象,编译器不进行对象类型检查,不进行属性类型检查,也不进行方法签名检查。很明显,它像HTTP+XML,完全基于运行时协议,没有一点儿静态的东西。如果类比委托的话,更理想的方式应该是,不进行对象类型检查,但进行属性类型和方法签名检查,就像下面这样:

string json = @"{ ""FirstName"": ""John"", ""LastName"": ""Smith"", ""Age"": 21 }";


dynamic person = CreateFromJson(json);

Console.WriteLine("{0} will be {1} next year", person.FirstName<string>, person.Age<int> + 1);
Console.WriteLine(person.ToJson<string>());

person.Play<string>("basketball");

string firstName = person.FirstName<string>;
int age = person.Age<int>;
Func<string> toJson = person.ToJson<Func<string>>;


Action<string> play = person.Play<Action<string>>;

这样,除了属性和方法的名称是动态的外,属性的类型和方法的签名都是静态的,把运行时错误的可能降到最低,同时享受静态检查的好处。其实,沿着这个思路,我们大可不必等着C#4.0的dynamic才开始动态类型,在C#2.0时代也可以这样:

object jsonObj = CreateFromJson(@"{ ""FirstName"": ""John"", ""LastName"": ""Smith"", ""Age"": 21 }");

Dynamic person = new Dynamic(jsonObject);

string firstName = person.Property<string>("FirstName");
int age = person.Age<int>("Age");
Func<string> toJson = person.Method<Func<string>>("ToJson");

Action<string> play = person.Method<Action<string>>("Play");

看到这里,相信您一定明白该如何实现Dynamic类了吧?如果觉得有用,就自己尝试实现一下吧!

后续

下一篇打算继续探讨在C#模拟实现动态类型,敬请关注!

系列文章:

C#动静结合编程之一: 接口和委托的约束强度

C#动静结合编程之二: 两种哲学

上一页  1 2 3 4 

Tags:动静 合编 程之三

编辑录入:爽爽 [复制链接] [打 印]
    赞助商链接