zoukankan      html  css  js  c++  java
  • 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));
    
  • 相关阅读:
    tcp/ip的通俗讲述(转)
    linux中的read_link
    浅拷贝和深拷贝
    JAVA的动态代理Jdk实现方式
    友元函数
    孤儿进程、僵尸进程
    waitpid()函数
    wait()函数
    dup2函数
    exec族函数
  • 原文地址:https://www.cnblogs.com/yeqifeng2288/p/14207742.html
Copyright © 2011-2022 走看看