C# NutShell 第二十章 动态编程

mac2026-02-03  2

数值统一类型

1.使用dynamic类型,编译时不会有错误,但是运行时如果类型错误,会报异常。

2.通常的做法是用泛型来约束类型(参数和返回值),在方法内部转成dynamic进行计算,最后再转回来。

3.由于最后再转回来的时候,会造成值损失,所以另外的办法就是重载多重类型

static T Mean<T>(T a, T b) { dynamic c = (dynamic)a + b; return (T)c; } static int Mean(int a, int b) { dynamic c = (dynamic)a + b; return (int)c; } static double Mean(double a, double b) { dynamic c = (dynamic)a + b; return (double)c; }

实现动态对象

DynamicObject

可以让动态类型在执行某一方法或调用某一属性时,在找不到具体的值时调用一个备用的方法。

class Program { static void Main(string[] args) { dynamic d = new Duck(); d.Fu(); Console.WriteLine(d.Age); Console.WriteLine(); Console.ReadLine(); } } public class Duck:DynamicObject { public string Name { get; set; } public void Fun() { Console.WriteLine("Fun"); } public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { Console.WriteLine(binder.Name + " method was called"); result = null; return true; } public override bool TryGetMember(GetMemberBinder binder, out object result) { Console.WriteLine(binder.Name + " get method was called"); result = "Try Get Member"; return true; } }

ExpandoObject

以键值对来存储属性,可以像字典一样来调用

dynamic d = new ExpandoObject(); d.Prop = "Hello World"; Console.WriteLine(d.Prop); var tran = (IDictionary<string, object>)d; Console.WriteLine(tran["Prop"]);

 

最新回复(0)