首页 > 解决方案 > 如何动态构建ctor

问题描述

我试图在运行时生成一个类,但我正在努力创建 ctor。

我有一个看起来像这样的基类:

public abstract class MyServiceBase : SomeOtherBaseClass
{
    private readonly ILogger _logger;
    private readonly IOptions<MyReaderOptions> _options;
    private readonly Extractor _extractor;
    private readonly IResolveSourceSystem _sourceSystemResolver;
    private readonly IAcceptLogs _logBuffer;

    protected MyServiceBase(ILogger logger,
                            IOptions<MyReaderOptions> options,
                            Extractor extractor,
                            IResolveSourceSystem sourceSystemResolver,
                            IAcceptLogs logBuffer)
    {
        _logger = logger;
        _options = options;
        _extractor = extractor;
        _sourceSystemResolver = sourceSystemResolver;
        _logBuffer = logBuffer;
    }

   // and then some public methods (not abstract - just normal implemented methods)

}

我想在运行时生成一个如下所示的类:

public class MyGeneratedReader : MyServiceBase
{
    public MyGeneratedReader(ILogger<MyGeneratedReader> logger,
                            IOptions<MyReaderOptions> options,
                            Extractor extractor,
                            IResolveSourceSystem sourceSystemResolver,
                            IAcceptLogs logBuffer)
                            : base(logger, options, extractor, sourceSystemResolver, logBuffer)
    {

    }
}

到目前为止,我可以生成类 - 但我正在努力添加 ctor。

我可以获得基类的 ctorInfo(见下文) - 但我不确定如何将其添加到新类型以及如何告诉它这应该调用基类。


var newTypeName = "SomeReader";
var assemblyName = new AssemblyName("DynamicReaders");
var dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var dynamicModule = dynamicAssembly.DefineDynamicModule("Main");
var dynamicType = dynamicModule.DefineType(
    newTypeName,
    TypeAttributes.Public
        | TypeAttributes.Class
        | TypeAttributes.AutoClass
        | TypeAttributes.AnsiClass
        | TypeAttributes.BeforeFieldInit
        | TypeAttributes.AutoLayout,
    typeof(MyServiceBase));
);

var basector = typeof(MyServiceBase).GetConstructor(
        BindingFlags.NonPublic | BindingFlags.Instance,
        null,
        new[] { typeof(ILogger),
                typeof(IOptions<ReaderOptions>),
                typeof(JsonExtractor),
                typeof(IDetermineSourceSystem),
                typeof(ICanAcceptLogs)
               },
        null);
// At this point basector contains the info for the base classes ctor.
// Now what ???

var type = dynamicType.CreateType();


知道如何将 ctor 添加到生成的类中,以便它知道调用基类 ctor 吗?

标签: c#inheritanceconstructorreflection.emittypebuilder

解决方案


推荐阅读