c#4.0中的dynamic早已不是新闻了,虽然内部用反射机制,略微会有一些性能上的额外开销,但是有些特殊场景还是很有用的,二害相权,取其轻吧(也正是因为这些动态编程特性,Python,Ruby这类动态语言能更方便的融入到.net平台中)
using System; using System.Collections.Generic; using System.Dynamic; namespace DynamicTest { class Program { public static void Main(string[] args) { dynamic obj = new ExpandoObject(); //动态添加一些属性 obj.name = "Jimmy"; obj.age = 30; //动态添加一个方法 obj.sayHello = new Action<string>(SayHello); foreach (var item in (IDictionary<string, object>)obj) { if (item.Key == "sayHello") { //调用动态添加的方法 Action<string> a = item.Value as Action<String>; a("CLR 4.0"); } else { Console.WriteLine("key={0},value={1}", item.Key, item.Value); } } Console.WriteLine("-----------------------------------------------"); var d = (IDictionary<string, object>)obj; d.Remove("name");//删除name属性 d.Remove("sayHello");//删除动态添加的方法 d.Remove("notExist");//删除一个并不存在的东西(不会引发异常) foreach (var item in (IDictionary<string, object>)obj) { Console.WriteLine("key={0},value={1}", item.Key, item.Value); } Console.Read(); } public static void SayHello(string msg) { Console.WriteLine("Hello,{0}!", msg); } } }
运行结果:
key=name,value=Jimmy
key=age,value=30
Hello,CLR 4.0!
------------------------------
key=age,value=30