一、动态类型
参考链接: https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/using-type-dynamic
如上文所属,动态类型的对象会跳过静态类型检查,也就是说使用了dynamic之后,在写代码的时候不管怎么使用都不会报错。
二、动态类型与匿名类型的区别
动态类型可以在声明之后再初始化。
匿名类型在声明的时候必须是初始化,并且不可再更改。
下面是错误示范,编译器必然提示。
var simple = new
{
Name = nameof(Program)
};
simple.Name = string.Empty;
但使用动态类型生命,是不会报错的。但是当运行到这里的时候就会提示错误
dynamic simple = new
{
Name = nameof(Program)
};
simple.Name = string.Empty;
上面这种做法虽然避免了在编译就报错的问题,但是由于动态类型simple中装的还是匿名类型,并不能随意的使用变量。
三、DynamicObject
参考 https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/walkthrough-creating-and-using-dynamic-objects
像ViewBag一样方便的使用动态类型。
1.创建一个GeneralDynamic类型。
动态类型的内部其实还是包裹了一个字典。
public class GeneralDynamic : DynamicObject
{
private readonly Dictionary<string, object> _generalDic;
public GeneralDynamic()
{
_generalDic = new Dictionary<string, object>();
}
public override IEnumerable<string> GetDynamicMemberNames()
{
return _generalDic.Keys;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (binder == null)
{
throw new ArgumentNullException(nameof(binder));
}
result = _generalDic[binder.Name];
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (binder == null)
{
throw new ArgumentNullException(nameof(binder));
}
_generalDic[binder.Name] = value;
return true;
}
}
2.使用动态类型new 变量。
dynamic simpleDyc = new GeneralDynamic();
simpleDyc.Show = new Action<string>((str) => { System.Console.WriteLine(str); });
simpleDyc.Show(nameof(simpleDyc.Show));