私は最近、プロパティ属性を利用しようとしています。次のコード (別のアセンブリ内) は、特定の属性を持つプロパティのみを名前で取得します。問題は、検索対象の属性が最初の属性である必要があることです。検索対象の属性の後に配置されていない限り、別の属性がプロパティに追加されると、コードが壊れます。
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);
次に、dcastro によって以下に提案されているように、IsDefined() を使用することができました。
IList<PropertyInfo> listKeyProps = properties
.Where(p => p.IsDefined(attributeType, true)).ToList();