1

MEFを使用したプラグインアーキテクチャのアプリケーションがあります。エクスポートされたすべてのパーツには、パーツの名前を持つ属性があります。これらの文字列を使用してリストボックス(など)で使用可能なパーツを表示するため、名前を変換したいと思います。

そこで、[Export]アノテーションに「Name = Strings.SomeText」を設定しようとしましたが、次のエラーが発生します。

「属性の引数は、定数式、typeof式、または属性パラメーターtypeの配列作成式である必要があります」

これに対する解決策はありますか?メタデータの使用は非常に便利であり(遅延読み込みを行います)、いくつかのテキストを翻訳するためだけにすべてを再設計したくはありません。

何か案は?ありがとう。

4

1 に答える 1

3

残念ながら、属性にはコンパイル時に認識されているデータしか含めることができないため、翻訳されたテキストを属性に直接提供することはできません。したがって、後で変換されたテストを検索するために使用できるコンパイル時定数値を提供する必要があります。

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を使用することです

于 2012-12-03T19:57:54.163 に答える