2012-12-03 30 views
1

我有一個使用MEF的插件體系結構的應用程序。對於每個導出的零件,都有一個帶有零件名稱的屬性,並且我想要翻譯名稱,因爲我使用這些字符串來顯示ListBoxes(或類似內容)中的可用零件。MEF中的本地化:導出屬性不支持資源(WPF-C#)

所以,我試圖設置「名稱= Strings.SomeText‘在[導出]註釋,但我得到以下錯誤:

’的屬性參數必須是一個常量表達式的typeof表達或陣列創建一個屬性參數類型的表達式「

是否有解決方案?我發現元數據的使用非常有用(我做延遲加載),我不想重新設計所有的東西只是爲了獲得一些文本翻譯。

有什麼建議?謝謝。

+0

僅供參考:我剛發現ME F 2支持我正在尋找的通用導入,但是您必須定位.NET Framework 4.5以利用此功能。 – Hannish

回答

3

不幸的是,您不能直接將翻譯文本提供給屬性,因爲屬性只能包含在compile time處已知的數據。因此,您需要提供一些編譯時間常量值,稍後您可以使用它來查找翻譯的測試。

一種解決方案是將資源名稱傳遞給屬性。然後,當您想要顯示翻譯文本時,您可以獲取資源名稱,查找資源中的文本並顯示結果。

例如您的屬性可能類似於:

[Export(Name = "SomeText")] 
public class MyExport 
{ 
} 

然後,當你想顯示你從定義導出組件加載資源字符串,你提取從加載資源的實際文本。例如像這樣(從another answer借來的):

var assembly = typeof(MyExport).Assembly; 

// Resource file.. namespace.ClassName 
var rm = new ResourceManager("MyAssembly.Strings", assembly); 

// exportName contains the text provided to the Name property 
// of the Export attribute 
var text = rm.GetString(exportName); 

有關此解決方案的一個明顯缺點是你失去了類型安全,您使用的Strings.SomeText屬性來獲取。

--------- ---------編輯

爲了更容易一點,讓你可以創建它接受ExportAttribute的衍生物譯文足夠的信息來提取翻譯的文本。例如自定義ExportAttribute可能看起來像這樣

public sealed class NamedExportAttribute : ExportAttribute 
{ 
    public NamedExportAttribute() 
     : base() 
    { 
    } 

    public string ResourceName 
    { 
     get; 
     set; 
    } 

    public Type ResourceType 
    { 
     get; 
     set; 
    } 

    public string ResourceText() 
    { 
     var rm = new ResourceManager(ResourceType); 
     return rm.GetString(ResourceName); 
    } 
} 

使用這個屬性,你可以應用它這樣

[NamedExport(
    ResourceName = "SomeText", 
    ResourceType = typeof(MyNamespace.Properties.Resources))] 
public sealed class MyClass 
{ 
} 

最後,當你需要得到翻譯後的文本,你可以做到這一點

var attribute = typeof(MyClass).GetCustomAttribute<NamedExportAttribute>(); 
var text = attribute.ResourceText(); 

另一種選擇是使用DisplayAttribute

+0

謝謝Petrik抽空回答。我沒有真正的希望找到一個好的選擇,在我的情況下,你的答案比較複雜(爲了其他不相關的原因)。無論如何,我將它標記爲答案,問候, – Hannish

+0

您是否定義了自己的ExportAttribute衍生類?如果是這樣,那麼你可能會捆綁所有必要的代碼來加載資源。 – Petrik

+0

事實上,我有我自己的ExportAttribute,但我不清楚如何在那裏應用您的解決方案。你有一個例子嗎?謝謝 – Hannish