首页 > 代码库 > dynamic的使用
dynamic的使用
一、在没有dynamic之前,我们想要获取返回object对象里的属性的值时,使用反射的方法来获取该对象的属性值。
class Program{ static void Main(string[] args) { object obj = GetObj("张三", 21); var objName = obj.GetType().GetProperty("Name").GetValue(obj); Console.WriteLine(objName); } static object GetObj(string name, int age) { return new { Name = name, Age = age }; }}
二、使用dynamic后,就可以直接【对象实例.属性名称】获取对象的属性值了。
class Program{ static void Main(string[] args) { dynamic obj = GetObj("张三", 21); var objName = obj.Name; Console.WriteLine(objName); } static object GetObj(string name, int age) { return new { Name = name, Age = age }; }}
三、当返回object对象的方法与调用的位置不在同一项目时(也就是当GetObj()方法在一个类库项目,而我在控制台中调用该方法),如:
我新建一个【DynamicClassLibrary】的类库项目,新建一个DynamicClass类,给它定义一个GetObj方法,而我在ConsoleApplication1控制台项目的Main方法中调用
namespace DynamicClassLibrary{ public class DynamicClass { public object GetDyObj(string name, int age) { // 还需要在当前程序集DynamicClassLibrary的AssemblyInfo.cs中加上[assembly: InternalsVisibleTo("使用该方法的程序集名称")] return new {Name = name, Age = age}; } }}
class Program{ static void Main(string[] args) { dynamic obj = new DynamicClassLibrary.DynamicClass().GetDyObj("张三", 21); var objName = obj.Name; var objAge = obj.Age; Console.WriteLine(objName + ":" + objAge); }}
这时候会报出这样的错误:【“object”未包含“Name”的定义】,原因可以看看:http://www.cnblogs.com/feiyun0112/p/4002291.html
解决办法有两种:
1、方法一:在DynamicClassLibrary项目的AssemblyInfo.cs中加上[assembly: InternalsVisibleTo("使用该方法的程序集名称")],这样就可以正常运行了。
2、方法二:使用dynamic自带的ExpandoObject类创建dynamic对象实例,这样就不用去修改DynamicClassLibrary项目的AssemblyInfo了,只需将GetObj方法改一下即可。
namespace DynamicClassLibrary{ public class DynamicClass { public object GetDyObj(string name, int age) { // 还需要在当前程序集DynamicClassLibrary的AssemblyInfo.cs中加上[assembly: InternalsVisibleTo("使用该方法的程序集名称")] //return new {Name = name, Age = age}; dynamic dyObj = new System.Dynamic.ExpandoObject(); dyObj.Name = name; dyObj.Age = age; return dyObj; } }}
dynamic的使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。