2010-11-12 79 views
3

我有一個Reflection.Emit的問題。我想要動態創建類,它具有簡單的ICollection實現。我定義了精細的所有方法,而不是未來兩,:公衆的IEnumerator的GetEnumerator()&的IEnumerator IEnumerable.GetEnumerator() 接下來的代碼顯示了什麼,我想在我的動態類:動態生成的類實現IEnumerator <T> GetEnumerator()和IEnumerator IEnumerable.GetEnumerator()

public class SomeClassThatIsIEnumerable<T> : IEnumerable<T> 
{ 
    public IEnumerator<T> GetEnumerator() 
    {...} 

    IEnumerator IEnumerable.GetEnumerator() 
    {...} 

} 

這一個是輸出從反射器打開了我的動態組裝:

public class SomeClassThatIsIEnumerable<T> : IEnumerable<T> 
    { 
     public IEnumerator<T> GetEnumerator() 
     { 
      ... 
     } 

     IEnumerator GetEnumerator() 
     { 
      ... 
     } 
    } 

我定義我的課以這樣的方式:

TypeBuilder myType = module.DefineType("myType"...); 
myType.AddInterfaceImplementation(typeof(IEnumerable)); 
myType.AddInterfaceImplementation(typeof(IEnumerable<T>)); 
myType.AddInterfaceImplementation(typeof(ICollection<T>)); 
myType.DefineMethodOverride(myDefineGetEnumerator(...),typeof(IEnumerable).GetMethod("GetEnumerator"); 
myType.DefineMethodOverride(myDefineGetGenericEnumerator(...),typeof(IEnumerable<T>).GetMethod("GetEnumerator); 
//Definitions of other ICollection methods 
//Define GetEnumerator is looks like this: 
MethodBuilder method = myType.DefineMethod("GetEnumerator", MethodAttributes.Final | MethodAttributes.Virtual...) 
ILGenerator il = method.GetILGenerator(); 
// adding opcodes 

WH我調用myType.CreateType TypeLoadException拋出消息GetEnumerator方法沒有實現。我在IEnumerable.GetEnumerator方法的問題上提出建議,因爲我在編寫C#時遇到了問題,即使在IL中也是如此:)。誰能幫我?

+0

什麼是你想要枚舉器*做*?最終,如果你搞亂'ILGenerator',你想得到非常熟悉的反射器和ildasm,看看它產生了什麼,並理解爲什麼。這是一個很難給出簡單答案的大問題/區域... – 2010-11-12 08:35:53

+0

我不知道如何生成動態程序集,否則ILGenerator。如果你能在此得到一個提示,我會非常感激你 – zabulus 2010-11-12 08:59:49

回答

1

答案已被下一個定義方法的

MethodBuilder myMethod = myType.DefineMethod("System.Collections.IEnumerable.GetEnumerator", 
        MethodAttributes.Private | MethodAttributes.HideBySig | 
       MethodAttributes.NewSlot | MethodAttributes.Virtual | 
       MethodAttributes.Final); 

這是驚人的,我認爲在方法的名稱寫一個接口名稱將建立與接口的獨特關係

2

看來你應該使用DefineMethod而不是DefineMethodOverride。 MSDN上有an example of emitting an explicit interface implementation。 (我還沒有采取但是嘗試一下的時間。)

+0

感謝鏈接,它是有幫助的,我發現了你的幫助的答案,但它不是你的答案。 – zabulus 2010-11-13 15:26:03

+0

@zabulus:沒問題。 – 2010-11-15 10:31:34