我最近一直在尝试使用属性属性。以下代码(在不同的程序集中)仅按名称检索具有特定属性的那些属性。问题是它要求搜索的属性是第一个属性。如果将不同的属性添加到属性中,则代码将中断,除非将其放置在要搜索的属性之后。
IList<PropertyInfo> listKeyProps = properties
.Where(p => p.GetCustomAttributes(true).Length > 0)
.Where(p => ((Attribute)p.GetCustomAttributes(true)[0])
.GetType().Name == "SomeAttribute")
.Select(p => p).ToList();
我确实看过这个答案,但由于对象位于 Assembly.GetEntryAssembly() 中并且我不能直接调用 typeof(SomeAttribute),因此无法使其工作。
如何改变这种情况以使其不那么脆弱?
[编辑:]我找到了一种确定属性类型的方法,尽管它位于不同的程序集中。
Assembly entryAssembly = Assembly.GetEntryAssembly();
Type[] types = entryAssembly.GetTypes();
string assemblyName = entryAssembly.GetName().Name;
string typeName = "SomeAttribute";
string typeNamespace
= (from t in types
where t.Name == typeName
select t.Namespace).First();
string fullName = typeNamespace + "." + typeName + ", " + assemblyName;
Type attributeType = Type.GetType(fullName);
然后我能够使用 IsDefined(),如下 dcastro 建议的那样:
IList<PropertyInfo> listKeyProps = properties
.Where(p => p.IsDefined(attributeType, true)).ToList();