C# Dynamic类型。

一、动态类型

参考链接: 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));
posted @ 2020-12-31 15:04  指左转右  阅读(432)  评论(0编辑  收藏  举报