在强语言体系中的 弱语言操作方式
缺点
编译时不进行 类型校验
dynamic str="abc";
int number= str; //编译器不会检测到此错误,在运行的时候才会报 隐式转换(implicitly Convert) 错误
- 技巧 json中的节点查询
string json = @"[
{
'Title': 'Json.NET is awesome!',
'Author': {
'Name': 'James Newton-King',
'Twitter': '@JamesNK',
'Picture': '/jamesnk.png'
},
'Date': '2013-01-23T19:30:00',
'BodyHtml': '<h3>Title!</h3>\r\n<p>Content!</p>'
}
]";
dynamic blogPosts = JArray.Parse(json);
dynamic blogPost = blogPosts[0];
string title = blogPost.Title;
Console.WriteLine(title);
// Json.NET is awesome!
string author = blogPost.Author.Name;
Console.WriteLine(author);
// James Newton-King
DateTime postDate = blogPost.Date;
Console.WriteLine(postDate);
- 类型转化
//虽然dynamic 在编译阶段被当做 objec 类型,但是它和object还是存在区别的, dynamic 可以直接进行类型转换,而object则不行。
dynamic nd= 123;
int val = nd;//无论在编译还是在运行都是没有问题的
objetct obj = 123;
int count = obj; //编译器肯定会报类型转换错误,必须用Convert.int() 等类型装换函数进行强转
dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
dynamic d4 = System.Diagnostics.Process.GetProcesses();
int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;
// dynamic 转换成Dictionary
dynamic data = new Person();
IDictionary<string,object> dic =data as IDictionary<string,object>;
// Dictionary 可以转换成dynamic
for(KeyValuePair<string,object> item in dic)
{
((IDictionary<string,object> )data).add(item.key,item.value);
}
- 简化反射
//dynamic 的实现
dynamic p = Activator.CreateInstance(typeof(person));
p.talk("muse");
//反射
var p1 = new person();
var takdMethod = typeof(person).GetMethod("talk");
takdMethod.Invoke(p1,new object[] { "kitty"});