获取CustomAttributeValue属性值为字符串数组
本文关键字:字符串 数组 CustomAttributeValue 属性 获取 | 更新日期: 2023-09-27 18:07:47
我想从所有类中获得customattribute的PropertyValue作为字符串
这是我从ExportAttribute
继承的自定义属性[JIMSExport("StockGroup","Stock")]
此属性附加在许多类上,但具有不同的参数。第一个参数表示ContractName,第二个参数表示属于哪个Module。
现在我想要一个字典
Dictionary<string, List<string>> moduleDict
与所有ModuleName(第二个参数)和ContractName(第一个参数),可以有相同模块名称的类,所以我需要一个合同名称列表与模块名称
我能够使用反射获得所有的JIMSExport属性,但未能生成字典
var exported = GetTypesWith<JIMSExportAttribute>(false).Select(x => x.GetCustomAttributes(true).First());
是否有更好的方法做到这一点,使用Caliburn Micro
也许你正在寻找这样的东西:
namespace AttributePlayground
{
class Program
{
static void Main(string[] args)
{
var moduleDict = makeModuleDict();
}
public static Dictionary<string, List<string>> makeModuleDict()
{
var attribs = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(
x => x.GetTypes()
.SelectMany(
y => y.GetCustomAttributes(typeof(JIMSExport), false)
)
)
.OfType<JIMSExport>();
return attribs
.GroupBy(x => x.Module)
.ToDictionary(
x => x.Key,
x => new List<String>(
x.Select(y => y.ContractName)
)
);
}
}
[JIMSExport("Module1", "Contract1")]
public class TestClass1
{
}
[JIMSExport("Module1", "Contract2")]
public class TestClass2
{
}
[JIMSExport("Module2", "Contract3")]
public class TestClass3
{
}
[JIMSExport("Module2", "Contract4")]
public class TestClass4
{
}
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)]
sealed class JIMSExport : Attribute
{
public readonly string ContractName;
public readonly string Module;
public JIMSExport(string Module,string ContractName)
{
this.Module = Module;
this.ContractName = ContractName;
}
}
}
需要使用SelectMany
和GroupBy
// allTypesWithReqdAttributes should contain list of types with JIMSExportAttribute
IEnumerable<object> attributeList = allTypesWithReqdAttribute.SelectMany(x => x.GetCustomAttributes(true));
var myAttributeList = attributeList.OfType<JIMSExportAttribute>();
// assumes JIMSExportAttribute has ModuleName and ContractName properties
var groups = myAttributeList.GroupBy(x => x.ModuleName, x => x.ContractName);
var result = groups.ToDictionary(x => x.Key, x => new List<string>(x));
foreach (var group in groups)
{
Console.WriteLine("module name: " + group.Key);
foreach (var item in group)
{
Console.WriteLine("contract name: " + item);
}
}
首先我要说的是,我对Caliburn Micro并不熟悉。因此,正常的MEF使用可能不适用的可能性很小。
您想要的可以实现与MEF的导出元数据。将自定义的ExportAttribute (JIMSExport)与导出元数据结合起来,并修改导入以包含元数据。学习前面链接中的"使用自定义导出属性"一节。
请注意,不应该退回到对加载的程序集使用反射。这可能会导致错误,因为反射将找到具有指定属性的所有类型,而您实际需要的是可以正确导出的类型。您需要组合容器可以使用的类型