属性和类
本文关键字:属性 | 更新日期: 2023-09-27 18:10:29
我在搜索,我怎么能知道内部属性定义,如果类我应用的属性,有另一个属性
例子:
[My1Attribute]
public class MyClass
{
[My2Attribute]
int aux{get;set;}
}
internal sealed class My1Attribute : Attribute
{
public My1Attribute
{
// How can I Know if 'MyClass' has My2Attribute applied ???
}
}
属性本身不知道它所附加的类。你需要使用其他一些服务/辅助函数/任何东西来配对它们。
但是,您可能会发现以下内容很有用:
public static bool HasAttribute<T, TAttribute>() where TAttribute : Attribute
{
return typeof (T).GetCustomAttributes(typeof (TAttribute), true).Any();
}
Edit:查找成员字段的属性
/// <summary>
/// Returns all the (accessible) fields or properties that for a given type that
/// have the "T" attribute declared on them.
/// </summary>
/// <param name="type">Type object to search</param>
/// <returns>List of matching members</returns>
public static List<MemberInfo> FindMembers<T>(Type type) where T : Attribute
{
return FindMembers<T>(type, MemberTypes.Field | MemberTypes.Property);
}
/// <summary>
/// Returns all the (accessible) fields or properties that for a given type that
/// have the "T" attribute declared on them.
/// </summary>
/// <param name="type">Type object to search</param>
/// <returns>List of matching members</returns>
public static List<MemberInfo> FindMembers<T>(Type type, MemberTypes memberTypesFlags) where T : Attribute
{
const BindingFlags FieldBindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
List<MemberInfo> members = new List<MemberInfo>();
members.AddRange(type.FindMembers(
memberTypesFlags,
FieldBindingFlags,
HasAttribute<T>, // Use delegate from below...
null)); // This arg is ignored by the delegate anyway...
return members;
}
public static bool HasAttribute<T>(MemberInfo mi) where T : Attribute
{
return GetAttribute<T>(mi) != null;
}
public static bool HasAttribute<T>(MemberInfo mi, object o) where T : Attribute
{
return GetAttribute<T>(mi) != null;
}
在这种情况下,您需要定义如何确定要检查哪些成员的规则。在您的示例中,您正在使用属性上的属性装饰,因此假设您有MyClass
的Type
实例(例如typeof(MyClass)
),您可以抓取属性:
var property = type.GetProperty("aux", BindingFlags.Instance | BindingFlags.NonPublic);
if (property.IsDefined(typeof(My1Attribute)))
{
// Property has the attribute.
}
(这是假设您实际上想要获取非公共实例属性,如果不调整您的BindingFlags
)。
如果你真的想使用属性:
var attib = property.GetCustomAttributes(typeof(My1Attribute), false)[0];
// Do something with the attribute instance.
您尝试过反射吗?,另外这里有一个相关的问题,你可能会发现有帮助:如何检查c#类是否有安全属性使用
我猜你的意思是一般找出是否有MyAttribute1类有My2Attribute(而不是具体的MyClass)。我能想到的唯一方法就是从反射中获取所有类的列表,并遍历它们,检查哪些类具有Attribute1,然后检查它们是否具有Attribute2。
我不认为你可以做任何聪明的事情,如自动检索类列表与当前属性。