2

クラスに関連する ID のリストを定義してクエリできるようにする MEF の一部であるカスタム属性を作成しました。

また、クラスにはそれ自体に定義が含まれている必要があります。これは重要であるため、次を使用することを考えました。

[SignalSystemData("ServiceIds", new List<int>(){1})]

どうすればいいですか?

私の検索の実装は次のとおりです。

        var c = new Class1();
        var v = c.EditorSystemList;

        foreach (var lazy in v.Where(x=>x.Metadata.LongName=="ServiceIds"))
        {
            if (lazy.Metadata.ServiceId.Contains(serviceIdToCall))
            {
                var v2 = lazy.Value;
                // v2 is the instance of MyEditorSystem
                Console.WriteLine(serviceIdToCall.ToString() + " found");

            }else
            {
                Console.WriteLine(serviceIdToCall.ToString() + " not found");
            }
        }

定義を含む私の Export クラスは次のようになります。

[Export(typeof(IEditorSystem))]
[SignalSystemData("ServiceIds", new List<int>{1})]
public class MyEditorSystem1 : IEditorSystem
{
    void test()
    {
        Console.WriteLine("ServiceID : 1");
    }
}


public interface IEditorSystem
{
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class SignalSystemDataAttribute : ExportAttribute
{
    public SignalSystemDataAttribute(string longName, List<int> serviceId)
        : base(typeof (IEditorSystem))
    {
        LongName = longName;
        ServiceId = serviceId;
    }

    public string LongName { get; set; }
    public List<int> ServiceId { get; set; }

}

public interface IEditorSystemMetadata
{
    string LongName { get; }
    List<int> ServiceId { get; }
}
4

1 に答える 1

0

コンパイル時定数の問題を回避するには、次の選択肢があります。

  • 特別にフォーマットされた文字列(つまり、すでに提案したように、カンマで区切られた整数のリスト)を使用してください。
  • ID の引数の数がそれぞれ異なる多数のオーバーロードを使用します。渡すIDが多すぎると、これは面倒になります。
  • params int[] idsコンストラクターの最後の引数として使用します。これは機能しますが、CLSに準拠していません-それが重要な場合。
  • int []配列引数を使用するのが最も簡単です。

もちろん、上記を組み合わせて使用​​することもできます。1 ~ 5 個の ID 引数を持つオーバーロードをいくつか用意し、文字列引数またはparams int[]オーバーロード引数が十分でない (できれば) コーナー ケースに引数を提供します。

更新:この質問/回答が見つかりました。重複していない可能性がありますが、同じ問題を扱っています (ほとんど)。

于 2012-04-30T09:58:50.943 に答える