C#中的动态类型
2017-08-25 00:00
113 查看
最近研究了一下C#中模拟动态语言的方法,发现可以通过继承DynamicObject来实现。DynamicObject包含的方法可查看msdn或直接查看api,简单说来,DynamicObject提供了一个机制,使得c#可以在运行时处理属性/方法/下标/运算符等操作,并人为定义/修改这些操作的含义。下面给出一个例子来说明。
上面的类可以通过如下语句调用
类似地,还可以定义下标和运算符的动态处理。
public class DynObj : DynamicObject { Dictionary<string, object> Properties = new Dictionary<string, object>(); Dictionary<string, object[]> Parameters = new Dictionary<string, object[]>(); // 仅用于记录参数便于回溯 Dictionary<string, dynamic> Methods = new Dictionary<string, dynamic>(); // 当找不到函数名称时,进入此方法 public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { if (!Parameters.Keys.Contains(binder.Name)) { Parameters.Add(binder.Name, null); } if (args != null) { Parameters[binder.Name] = args; } if (Methods.ContainsKey(binder.Name)) { result = Methods[binder.Name](args); } else { result = null; } return true; } // 设置动态属性的值,因为方法和属性的设置方法可能一样,所以动态方法也可在此设置 public override bool TrySetMember(SetMemberBinder binder, object value) { if (!Methods.ContainsKey(binder.Name) && value is Delegate) { Methods.Add(binder.Name, value); } else if (!Properties.Keys.Contains(binder.Name)) { Properties.Add(binder.Name, value); } return true; } // 获取动态属性的值 public override bool TryGetMember(GetMemberBinder binder, out object result) { return Properties.TryGetValue(binder.Name, out result); } // 如果方法已经存在,则不进入TryInvokeMember,直接进入已有方法 public string Test() { return "This is a test function"; } }
上面的类可以通过如下语句调用
dynamic test = new DynObj(); test.a = "hello"; test.b = 10; test.func1 = new Func<object[], double>((x) => { return Convert.ToInt32(x[0]) + Convert.ToInt32(x[1]); }); Console.WriteLine(test.a); // 结果为"hello" Console.WriteLine(test.b); // 结果为10 Console.WriteLine(test.func1(5, 10)); // 结果为15 Console.WriteLine(test.Test()); // 结果为"This is a test function" Console.WriteLine(test.Test("Hello")); // 因为从未定义过,进入TryInvokeMember,但找不到,结果为空
类似地,还可以定义下标和运算符的动态处理。
相关文章推荐
- C# 通过反射来动态创建泛型类型
- c#动态类型,及动态对象的创建,合并2个对象,map
- C#的动态类型ExpandoObject和DynamicObject
- 【点滴积累】在C#中使用反射动态调用类型成员
- 在不对控件类型进行硬编码的情况下在 Visual C# .NET 中动态添加控件
- [C#基础知识系列]专题十七:深入理解动态类型 推荐
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- C# 利用反射动态创建对象——带参数的构造函数和String类型
- C#调用Excel报 error CS1969: 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?
- c#.net 内存中 动态创建类型以及程序集
- 利用C#的动态类型来实现与rails类似的元编程(1)
- 微型ORM——用VB和C#编写的动态类型ORM
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- C# 中反射获取某类的子类和根据类型名动态创建对象(转载)
- C#4.0 dynamic动态类型
- C# 利用反射动态创建对象——带参数的构造函数和String类型
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- C# 4.0中的动态类型和动态编程
- C# 在运行时动态创建类型