2010-09-30 64 views
2

是否可以從導入的MEF函數中獲取程序集信息?我需要知道包含該函數的組件版本和插件控件的名稱。嘗試了以下,但它只是返回System.ComponentModel.Composition版本。如何獲取導入的MEF函數的彙編信息?

foreach (Lazy<Func<int>, IMetadata> func in PluginFuncs) 
{ 
    // get assembly information of the Plugin control for the imported function 
    string version = func.GetType().Assembly.GetName().Version.ToString(); 
    Console.WriteLine(version); 
} 

另一種方法是在元數據中使用硬編碼值,但我認爲這是不可維護的。當版本改變時,很容易忘記更改這些值。

回答

2

您需要檢查func.Value以內的類型,而不是Lazy<T,TMeta>包裝它。嘗試:

Func<int> lambdaFunc = func.Value; 
Delegate del = lambdaFunc; 
string version = del.Method.ReflectedType.Assembly.GetName().Version.ToString(); 

然而,意識到這將在這一點上評價Lazy<T> - 但這是必需的,因爲在那裏你試圖獲得類型的對象沒有被構建,直到您評估。

+0

感謝您的建議,但現在它返回mscorlib的版本。還有什麼想法? – 2010-09-30 16:02:22

+0

@John_Sheares:哦,該死的 - 這很有道理 - Func 是System.Func ... mmm ...讓我想想 – 2010-09-30 16:10:54

+0

@John_Sheares:我相信上面現在可以工作。通過分配給委託,可以通過Delegate.Method中返回的MethodInfo來獲取定義方法的類型。 – 2010-09-30 16:16:43