残念ながら、属性にはコンパイル時に認識されているデータしか含めることができないため、翻訳されたテキストを属性に直接提供することはできません。したがって、後で変換されたテストを検索するために使用できるコンパイル時定数値を提供する必要があります。
1つの解決策は、リソース名を属性に渡すことです。次に、翻訳されたテキストを表示する場合は、リソース名を取得し、リソース内のテキストを検索して結果を表示します。
たとえば、属性は次のようになります。
[Export(Name = "SomeText")]
public class MyExport
{
}
次に、文字列を表示する場合は、エクスポートを定義するアセンブリからリソースをロードし、ロードされたリソースから実際のテキストを抽出します。たとえば、このように(別の回答から借りたように):
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);
このソリューションの明らかな欠点の1つは、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を使用することです