这可能有点不寻常,但是所有这些都是为了避免代码生成。
我的目标:创建一个继承接口的动态类,并且我还想覆盖所有公共方法。
到目前为止我所拥有的:
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属性:
问题是当我尝试投射它时:
Vehicle = Activator.CreateInstance(MyTypeBuilder.CompileResultType(typeof(T))) as T;
给我一个空值,因此,为了解决这个问题,我在CompileResultType中为动态类添加了“ AddInterfaceImplementation”,因为我实现了Maker()方法!
有人知道解决这个问题的方法吗?