2

我创建了作为 MEF 一部分的自定义属性,我想在其中定义与类相关的 id 列表,以便可以查询它们。

此外,该类必须在其自身中包含定义,这很重要,这就是我考虑使用的原因:

[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(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 回答