.NET 3.5的时候加入了匿名类型这个特性,我们可以直接使用 new {name="abc"} 来直接生成一个对象。这个特性现在应用的地方很多,比如dapper的查询参数都是用匿名对象。
其实匿名对象也不是真的没有名称,编译器在编译后自动会生成一个Type。我们看看IL就知道了。
photoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训
编译器会自动生成一个叫做<>f__AnonymousType0`1的类型。

动态生成类型

但是有的时候我们可能类型里面的字段都是不确定的,这个时候我们就需要去动态生成一个类型了。

  • 动态生成类型第一个想到的就是反射,但是仔细想想反射都是基于现有Type的基础上完成的,咱们现在连Type都没有,所以这条路不通。

  • 第二个dynamic,dynamic确实是个好办法,可以动态指定字段的名称,但是有的三方的库不支持比如dapper。

  • 最后CodeDom,CodeDom可以在运行时直接生成一个Type。CodeDom生成Type主要分成3步。
    比如我们要生成一个Person类:

    public class Person{public string name;public ing age;public Person(string name ,int age){    this.name = name;    this.age = age;
    }
    }

    构造类型

        private string _ns = "__x";    private string _className;    private Dictionary<Type, string> _fieldsDictionary;    private string _sourceCode;    private CodeCompileUnit _targetUnit;    private CodeTypeDeclaration _targetClass;    public SourceCodeCreater(string cla
            
    		

    网友评论