C#创建一个继承接口的运行时类,并重写这些方法

C#创建一个继承接口的运行时类,并重写这些方法,c#,generics,dynamic,reflection,activator,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 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();
}
给我一个空值,所以为了解决这个问题,我在CompileResultType中为我的动态类添加了一个“AddInterfaceImplementation”,因为我实现了Maker()方法

但这种情况会发生:


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

这看起来真的像个XY问题。您试图解决的实际问题是什么?只是为了避免生成一堆类?你为什么需要这些课程?你的
BMW
车型看起来没有任何实际功能,那么你为什么需要它呢?我想拥有很多智能车,但不必每次更换主车型:BMW时都对所有代码进行编码。BMW什么都不做正是我想要的,我想在运行时控制类的行为,我想你需要更详细地了解。如果更改
BMW
类,为什么必须生成代码?描述一下你希望你的最终结果是什么,在一个广泛的,非编程唤醒理解,但你所做的看起来是非常错误的。我试图帮助你朝着正确的方向前进(使用反射通常不是正确的方向)。我只是需要你提供更多的信息,这样我才能给你一个正确的答案。我做这个例子很容易,但我可以试着解释。我希望能够通过HTTP调用此BMW,因此方法Maker()将有一个HTTP请求,但我不希望每次需要调用Maker时都创建Get/Post请求,我想弄清楚它,然后将url传递给它,它将为我进行此调用提供intellisense。基本上,硬编码的可能性越小。
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);
    }
Vehicle = Activator.CreateInstance(MyTypeBuilder.CompileResultType(typeof(T))) as T;