将列表添加到系统属性中
本文关键字:属性 系统 列表 添加 | 更新日期: 2023-09-27 18:32:46
我创建了作为 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; }
}
要解决编译时常量问题,您有以下选择:
- 使用特殊格式的字符串(即逗号分隔的整数列表,如您已经建议的那样)。
- 使用多个重载,每个重载具有不同数量的 ID 参数。如果您有太多 ID 无法传递,这会变得混乱。
- 使用
params int[] ids
作为构造函数的最后一个参数。这将起作用,但不符合 CLS - 如果这对您很重要的话。 - 最容易使用数组
int []
参数。
当然,您也可以使用上述组合。有几个重载,比如 1 到 5 个 ID 参数,并为那些(希望)极端情况提供字符串参数或params int[]
参数,其中重载参数是不够的。
更新:刚刚找到这个问题/答案。可能不是重复的,但处理相同的问题(大部分)。