2010-11-18 37 views
4

我想使用TypeBuilder來構建一個匹配接口的類型。它的基本類型將是對象,因爲我沒有任何抽象點。如果我使用TypeBuilder構建一個帶有屬性的類型,我是否需要使用propertyBuilder?

有問題的接口有像這樣::

public interface IFoo{ 
    int Property{get;} 
} 

我需要實際創建PropertyBuilder的屬性?或者我可以放棄使用int get_Property()方法的方法嗎?

+0

+1有趣的問題。我唯一一次動態創建一個類型,我只是使用公共字段,以免與PropertyBuilders混淆。 – BFree 2010-11-18 01:50:57

回答

5

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; 
+0

謝謝!這將使我的鴨嘴更容易,但是如果方法實際上沒有在類型上定義,爲什麼要進行MethodOverride? – 2010-11-18 03:56:19

+0

@邁克爾 - 因爲這是你如何告訴它什麼方法提供了實現。如果查看CLI標誌,則接口方法在技術上是隱式的虛擬方法。 – 2010-11-18 04:03:46

+0

很酷。如果我聲明一個名爲get_Property的公共虛擬方法,它似乎也可以工作。我想這是需要的,如果我想爲多個接口添加不同的實現。 – 2010-11-18 04:16:55

0

我覺得你需要使用PropertyBuilder - .Net中的一個屬性不像get_和/或set_方法那麼簡單 - 還需要額外的元數據。

雖然我從來沒有使用過TypeBuilder,但是如果你能夠通過發射get_方法逃脫,我會感到非常驚訝。

+0

令人驚訝與否,你*可以*只是發出一個get方法 - 事實上,它根本不需要是'get_' *。 – 2010-11-18 03:24:47

+0

我今天學到了新東西。有什麼地方可以閱讀關於CLI古怪的東西嗎? – TheEvilPenguin 2010-11-18 03:58:54

相關問題