C# 装饰匿名类型
所以我试了一下:C# 装饰匿名类型,c#,anonymous-types,C#,Anonymous Types,所以我试了一下: static void Main() { var anonymous = new { Key = "Key", Value = "Value" }; AssemblyBuilder builder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName( "MineAsm"), AssemblyBuilderAccess.Run); ModuleBuilder modBuilder = buil
static void Main() {
var anonymous = new { Key = "Key", Value = "Value" };
AssemblyBuilder builder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName( "MineAsm"), AssemblyBuilderAccess.Run);
ModuleBuilder modBuilder = builder.DefineDynamicModule("MineModule");
TypeBuilder mineType = modBuilder.DefineType("MineType", TypeAttributes.Public, anonymous.GetType());
Type definedType = mineType.CreateType();
Object instance = Activator.CreateInstance(definedType);
foreach (PropertyInfo property in definedType.GetProperties()) {
Console.WriteLine("{0} {1}", property.Name, property.GetValue(instance));
}
Console.ReadLine();
}
但我得到一个例外,就是匿名类型是密封的。令人惊叹的。我正在试验的是用属性包装匿名类型的能力,这些属性可以在值发生更改时进行标识。我知道匿名类型本身是不能修改的,但如果能够以某种方式对其进行修饰,使编译器能够从新的{}
语句生成基本结构,那就太好了,但是我使用它运行,使它更具普遍意义(例如,使属性像排序的ORM一样可监视),然而,编译器仍然理解该结构,因此能够提供intellisense
即使不使用我当前遵循的路径,这是否可行?因为匿名类型是不可变的,您真正想做的是什么?使用匿名类型提供的编译器辅助/intellisense,然后对其进行子类化以使对象可编辑,从而可以监视所述编辑。尝试ORM的想法。正如你已经发现的,这是不可能的。您当然可以在运行时使用匿名类型作为模板生成可变对象,但您只能使用反射来访问它,因为编译器有权访问的代码都不会知道它。您看过T4模板了吗?
编译器有权访问的代码都不会知道它。废话,没错。Thanks@sircodesalot,我会放弃使用匿名类型的概念。但是,原则上,您可以使用普通类,并使用(生成的)子类随后覆盖的虚拟(自动)属性。我以前曾尝试过这种方法,它会很好地工作,尽管您仍然会遇到一些困难,因为您无法使用new
操作符进行更新。