数值统一类型
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"]);