這應該工作:
var tb = mb.DefineType("Test", TypeAttributes.Public);
var iface = typeof(IComparable<>).MakeGenericType(tb);
tb.AddInterfaceImplementation(iface);
var meb = tb.DefineMethod("CompareTo", MethodAttributes.Public | MethodAttributes.Virtual, typeof(int), new [] { tb });
var il = meb.GetILGenerator();
il.ThrowException(typeof(Exception));
var type = tb.CreateType();
幸運的是,從TypeBuilder類型繼承,所以你可以在MakeGenericType
使用它。
作爲驗證,這個工程:
var o1 = Activator.CreateInstance(type);
var o2 = Activator.CreateInstance(type);
typeof(IComparable<>).MakeGenericType(o1.GetType()).GetMethod("CompareTo").Invoke(o1, new [] { o2 }).Dump();
您不必生成的方法綁定到任何方式的界面,這是不夠的,他們的簽名是一樣的。做明確的接口實現可能有點棘手,但你不應該需要這樣做。
希望我有時間玩這個..但我期待着別人回答! –
我看到一個方法['addInterfaceImplementation'](http://msdn.microsoft.com/zh-cn/library/system.reflection.emit.typebuilder.addinterfaceimplementation(v = vs.110).aspx),你可以調用在您構建新類型之後,您的['TypeBuilder'](http://msdn.microsoft.com/zh-CN/library/system.reflection.emit.typebuilder(v = vs.110).aspx)。之後你不能使用這種方法將「Comparable''添加到你的類型中嗎? –
@JeroenVannevel我不認爲這是允許的。我很肯定你只能調用一次'CreateType'。 – Anthony