C#创建一个运行时类,该类继承一个接口并覆盖方法

时间:2018-08-07 21:26:00

标签: c# generics dynamic reflection activator

这可能有点不寻常,但是所有这些都是为了避免代码生成。

我的目标:创建一个继承接口的动态类,并且我还想覆盖所有公共方法。

到目前为止我所拥有的:

public class Program
{
    private static void Main(string[] args)
    {
        var bmw = new BMW();
        var maker = bmw.Vehicle.Maker();
        Console.WriteLine(maker);
    }
}

public class BMW : SmartCar<ICar>
{
    public BMW() : base()
    {
    }
}

public class SmartCar<T> where T : class
{
    public T Vehicle { get; set; }

    public SmartCar()
    {
        Vehicle = Activator.CreateInstance(MyTypeBuilder.CompileResultType(typeof(T))) as T;
    }
}

public interface ICar
{
    string Maker();
}

作为参考,MyTypeBuilder来自:How to dynamically create a class in C#?

我做了一些更改:

private static void CreateMethod(MethodInfo t, TypeBuilder tb)
    {
        // MethodBuilder
        var mbuilder = tb.DefineMethod(t.Name,
            MethodAttributes.Public, // | MethodAttributes.Static, // Only works if Static is there
            t.ReturnType,
            t.GetParameters().Select(x => x.ParameterType).ToArray());

        Expression<Func<string>> expression = () => "Hi BMW";

        expression.CompileToMethod(mbuilder);
    }

如果不放置静态变量,则会得到无效的参数值。 否则,我需要使用static method属性:

DynamicType

问题是当我尝试投射它时:

Vehicle = Activator.CreateInstance(MyTypeBuilder.CompileResultType(typeof(T))) as T;

给我一​​个空值,因此,为了解决这个问题,我在CompileResultType中为动态类添加了“ AddInterfaceImplementation”,因为我实现了Maker()方法!

但是这发生了: Crash

有人知道解决这个问题的方法吗?

0 个答案:

没有答案