Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 装饰匿名类型_C#_Anonymous Types - Fatal编程技术网

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
操作符进行更新。