我有一个名为“InfoTest”的“Form1”类的属性,它有一些我想要访问的自定义属性。
代码工作正常,但有点笨拙:
[Test("foo",15)]
public double InfoTest { get; set; }
public void RetrieveAttribute()
{
PropertyInfo field_info = typeof(Form1).GetProperty("InfoTest");
object[] custom_attributes = field_info.GetCustomAttributes(typeof(TestAttribute), false);
TestAttribute thisAttribute = (TestAttribute)custom_attributes[0];
Debug.WriteLine(thisAttribute.Info + "," + thisAttribute.TheValue);
}
我认为答案是“否”,但是有一种更简单的方法来获取InfoTest的属性,它不涉及`typeof(Form1).GetProperty(“InfoTest”)?我不能去(例如):
var runtimePropInfo = InfoTest.GetType().GetRuntimeProperties();
var propInfo = InfoTest.GetType().GetProperties();
...这主要是因为它试图获取“双”的属性,而不是“InfoTest”对象的属性。
答案 0 :(得分:1)
只需依靠内置函数,您可以使用MemberInfo
PropertyInfo field_info = typeof(Form1).GetProperty("InfoTest");
TestAttribute thisAttribute = field_info.GetCustomAttribute<TestAttribute>(false);
Debug.WriteLine(thisAttribute.Info + "," + thisAttribute.TheValue);
上的an extension method来简化它,它可以直接返回自定义属性。
object
摆脱了public static class ReflectionExtensions
{
public static TAttribute GetAttribute<TAttribute, TClass>(this TClass target, Expression<Func<TClass, object>> targetProperty) where TAttribute : Attribute
{
var lambda = (LambdaExpression) targetProperty;
var unaryExpression = (UnaryExpression) lambda.Body;
string name = ((MemberExpression) unaryExpression.Operand).Member.Name;
MemberInfo info = typeof(TClass).GetProperty(name);
return info.GetCustomAttribute<TAttribute>(false);
}
}
数组和类型转换。
如果您愿意使用自定义扩展方法,则可以使用此方法将其简化为一个函数调用。它具有强类型的好处,尽管它可能没有那么高效。
object
它可用于任何事物(它是var attr = thing.GetAttribute<TestAttribute, Thing>(obj => obj.InfoTest);
的扩展名),如下所示:
TestAttribute
它从InfoTest
的{{1}}属性中获取thing
,这是Thing
类的实例。
Thing
定义为:
public class Thing
{
[Test("foo", 15)]
public double InfoTest { get; set; }
}