假设我有课
class A
{
[Attribute1]
[AttributeN]
bool Prop {get;set;}
}
void Main ()
{
A a;
var attrs = GetAttributes(a.Prop);
}
哪个是实现GetAttributes函数的最佳方法?
非常感谢
编辑: 让我更具体一点,我知道需要使用reflaction 我不想使用字符串作为方法名称 2.它不应该依赖于类型,应该是通用函数
function GetAttr<...>(...)
{
....
typeof(<get from param>).GetMethod(<figure out from parameters>).GetAttributes()
}
// Ideally I want to call GetAttr like below
A1 a1
GetAttr(a1.Prop1)
B2 b2
GetAttr(b2.Prop2)
答案 0 :(得分:5)
您可以使用GetCustomAttributes方法:
var attrs = typeof(A).GetProperty("Prop",BindingFlags.Instance | BindingFlags.NonPublic)
.GetCustomAttributes(false);
如果您想使用自定义方法,那么您可以定义一个简单的方法:
public static object[] GetAttributes(Type type, string propertyName)
{
var prop = type.GetProperty(propertyName);
if (prop != null)
{
return prop.GetCustomAttributes(false);
}
else
{
return null;
}
}
BindingFlags
public static object[] GetAttributes(Type type, string propertyName,BindingFlags flags)
{
var prop = type.GetProperty(propertyName,flags);
if (prop != null)
{
return prop.GetCustomAttributes(false);
}
else
{
return null;
}
}
然后你可以这样称呼它:
var attrs = GetAttributes(typeof(A), "Prop");
或者:
var attrs = GetAttributes(typeof(A), "Prop",BindingFlags.Instance | BindingFlags.NonPublic);
答案 1 :(得分:3)
您可以创建将接受属性选择器表达式的扩展方法(因此您将避免将属性名称硬编码为字符串):
public static IEnumerable<Attribute> GetPropertyAttributes<T, TProp>(
this T obj, Expression<Func<T, TProp>> propertySelector)
{
Expression body = propertySelector;
if (body is LambdaExpression)
body = ((LambdaExpression)body).Body;
if (body.NodeType != ExpressionType.MemberAccess)
throw new InvalidOperationException();
var pi = (PropertyInfo)((MemberExpression)body).Member;
return pi.GetCustomAttributes();
}
用法:
A a = new A();
var attributes = a.GetPropertyAttributes(x => x.Prop);
答案 2 :(得分:0)
您应该只使用Reflection来实现您的目标。在这种情况下,您需要利用两种反射方法,即GetProperty
和GetCustomAttributes
:
class A
{
[Attribute1]
[AttributeN]
bool Prop {get;set;}
}
void Main ()
{
A a;
var attrs = typeof(A).GetProperty("Prop").GetCustomAttributes();
}