C# dynamic 支持动态语言运行时的类(强语言中的弱语言实现方式)

在强语言体系中的 弱语言操作方式

缺点 编译时不进行 类型校验

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"});

参考 dynamic关键字以及优势和劣势、类型转换以及Dictionary之间的转换
参考 dynamic的正确用法

你可能感兴趣的:(C#)