更简单的访问自定义属性的方法?

时间:2017-07-25 01:35:52

标签: c# reflection attributes

我有一个名为“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”对象的属性。

1 个答案:

答案 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; }
}