我想使用TypeBuilder來構建一個匹配接口的類型。它的基本類型將是對象,因爲我沒有任何抽象點。如果我使用TypeBuilder構建一個帶有屬性的類型,我是否需要使用propertyBuilder?
有問題的接口有像這樣::
public interface IFoo{
int Property{get;}
}
我需要實際創建PropertyBuilder的屬性?或者我可以放棄使用int get_Property()
方法的方法嗎?
我想使用TypeBuilder來構建一個匹配接口的類型。它的基本類型將是對象,因爲我沒有任何抽象點。如果我使用TypeBuilder構建一個帶有屬性的類型,我是否需要使用propertyBuilder?
有問題的接口有像這樣::
public interface IFoo{
int Property{get;}
}
我需要實際創建PropertyBuilder的屬性?或者我可以放棄使用int get_Property()
方法的方法嗎?
CLI不關心性能,只要所有的方法(這是所有的接口真的定義)必須實現:
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("foo"), AssemblyBuilderAccess.RunAndSave);
var mb = ab.DefineDynamicModule("foo");
var tb = mb.DefineType("bar");
tb.AddInterfaceImplementation(typeof(IFoo));
var method = typeof(IFoo).GetProperty("Property").GetGetMethod();
var impl = tb.DefineMethod("impl",
MethodAttributes.Private | MethodAttributes.Virtual,
typeof(int), Type.EmptyTypes);
var il = impl.GetILGenerator();
il.Emit(OpCodes.Ldc_I4_7); // because it is lucky
il.Emit(OpCodes.Ret);
tb.DefineMethodOverride(impl, method);
var type = tb.CreateType();
IFoo foo = (IFoo)Activator.CreateInstance(type);
var val = foo.Property;
謝謝!這將使我的鴨嘴更容易,但是如果方法實際上沒有在類型上定義,爲什麼要進行MethodOverride? – 2010-11-18 03:56:19
@邁克爾 - 因爲這是你如何告訴它什麼方法提供了實現。如果查看CLI標誌,則接口方法在技術上是隱式的虛擬方法。 – 2010-11-18 04:03:46
很酷。如果我聲明一個名爲get_Property的公共虛擬方法,它似乎也可以工作。我想這是需要的,如果我想爲多個接口添加不同的實現。 – 2010-11-18 04:16:55
我覺得你需要使用PropertyBuilder - .Net中的一個屬性不像get_和/或set_方法那麼簡單 - 還需要額外的元數據。
雖然我從來沒有使用過TypeBuilder,但是如果你能夠通過發射get_方法逃脫,我會感到非常驚訝。
令人驚訝與否,你*可以*只是發出一個get方法 - 事實上,它根本不需要是'get_' *。 – 2010-11-18 03:24:47
我今天學到了新東西。有什麼地方可以閱讀關於CLI古怪的東西嗎? – TheEvilPenguin 2010-11-18 03:58:54
+1有趣的問題。我唯一一次動態創建一個類型,我只是使用公共字段,以免與PropertyBuilders混淆。 – BFree 2010-11-18 01:50:57