我要问一个听起来很奇怪的问题。

有没有办法在运行时建立一个新类?或至少将新属性添加到现有类。

我的意思是创建一个不存在的类,而不是现有类的实例。以后我可以使用反射来加载和使用此类。

最佳答案

无法向现有类型添加属性,但是您可以在运行时使用Reflection.Emit创建新类型。这是非常复杂的东西,它是这样的:

AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(
      assemblyName , AssemblyBuilderAccess.Run, assemblyAttributes);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("ModuleName");
TypeBuilder typeBuilder = moduleBuilder.DefineType(
      "MyNamespace.TypeName" , TypeAttributes.Public);

typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);

// Add a method
newMethod = typeBuilder.DefineMethod("MethodName" , MethodAttributes.Public);

ILGenerator ilGen = newMethod.GetILGenerator();

// Create IL code for the method
ilGen.Emit(...);

// ...

// Create the type itself
Type newType = typeBuilder.CreateType();

这段代码只是一个示例。它可能包含错误。

您还可以通过在运行时使用System.CodeDom编译C#源代码来生成类,但是我对此并不了解。

10-08 14:07