C#动静结合编程之三:Duck Typing
2009-03-26 08:20:24 来源:WEB开发网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#动静结合编程之二: 两种哲学
更多精彩
赞助商链接