2011-01-19 28 views
1

TypeBuilder.GetMethod可以讓你獲得一個泛型類型由TypeBuilder封閉的方法,因此讓我到以下幾點:TypeBuilder.GetMethod上TypeBuilder

TypeBuilder tb = .... 
// this would throw a NotSupportedException : 
// var ec = typeof(EqualityComparer<>). 
//  MakeGenericType(tb).GetMethod("get_Default"); 

// this works: 
var ec = TypeBuilder.GetMethod(tb, typeof(EqualityComparer<>). 
    GetMethod("get_Default"); 

什麼不工作(我不明白如何使它的工作呢)是這樣的:

Type collectionOf = typeof(ICollection<>).MakeGenericType(tb); 
// throws: 'Type must be a type provided by the runtime. 
// Parameter name: types' 
var colEc = TypeBuilder.GetMethod(collectionOf, typeof(EqualityComparer<>). 
    GetMethod("get_Default"); 
// throws NotSupportedException 
colEc = typeof(EqualityComparer<>).MakeGenericType(collectionOf). 
    GetMethod("get_Default"); 

任何人都知道答案(我希望它是42)...?

回答

2

這並不完全清楚,我你想做什麼(它看起來像你錯過了一些括號,其他問題),但如果你想獲得一個EqualityComparer<ICollection<YourType>>.get_DefaultMethodInfo,這個工作對我來說:

var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("test"), 
      AssemblyBuilderAccess.Run); 
var mb = ab.DefineDynamicModule("test"); 
var tb = mb.DefineType("TestType"); 

var ico = typeof(ICollection<>); 
var eq = typeof(EqualityComparer<>); 

var m = TypeBuilder.GetMethod(eq.MakeGenericType(ico.MakeGenericType(tb)), eq.GetMethod("get_Default")); 
+0

不,TypeBuilder.GetMethod說這個類型必須是一個類型建造者類型。 – Jeff 2011-01-19 20:14:26

1

就像前面說的那樣,你不能對尚未創建的類型進行反思。

您需要跟蹤方法,或者確保您有一個從調用TypeBuilder.CreaterType()返回的運行時類型。 TypeBuilder'方便地'如果它已經被創建,它會跟蹤爲你創建的運行時類型。

這幾乎適用於所有類型的反射操作,而不僅僅是TypeBuilder

更新:

我以前沒有注意到TypeBuilder.GetMethod,所以我可能是錯的上方。會發現細節。 :)

更新2:可能的解決方法

請問以下工作?

typeof(EqualityComparer<>).GetMethod("get_Default").MakeGenericMethod(tb) 

應該測試:(

+0

問題似乎是我實際上沒有一個TypeBuilder,我想爲它發出一個方法...這是一個EqualityComparer > ... – Jeff 2011-01-19 20:21:09

相關問題