2012-12-03 31 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