12

我编写了一个自定义属性,用于类的某些成员:

public class Dummy
{
    [MyAttribute]
    public string Foo { get; set; }

    [MyAttribute]
    public int Bar { get; set; }
}

我能够从类型中获取自定义属性并找到我的特定属性。我不知道该怎么做是获取分配属性的值。当我获取 Dummy 的实例并将其(作为对象)传递给我的方法时,如何获取从 .GetProperties() 返回的 PropertyInfo 对象并获取分配给 .Foo 和 .Bar 的值?

编辑:

我的问题是我不知道如何正确调用 GetValue。

void TestMethod (object o)
{
    Type t = o.GetType();

    var props = t.GetProperties();
    foreach (var prop in props)
    {
        var propattr = prop.GetCustomAttributes(false);

        object attr = (from row in propattr where row.GetType() == typeof(MyAttribute) select row).First();
        if (attr == null)
            continue;

        MyAttribute myattr = (MyAttribute)attr;

        var value = prop.GetValue(prop, null);
    }
}

但是,当我这样做时,prop.GetValue 调用给了我一个 TargetException - 对象与目标类型不匹配。如何构建此调用以获取此值?

4

2 回答 2

12

您需要将对象本身传递给 GetValue,而不是属性对象:

var value = prop.GetValue(o, null);

还有一件事 - 您不应该使用 .First(),而是 .FirstOrDefault(),因为如果某些属性不包含任何属性,您的代码将引发异常:

object attr = (from row in propattr 
               where row.GetType() == typeof(MyAttribute) 
               select row)
              .FirstOrDefault();
于 2011-02-04T08:28:48.073 回答
3

你得到一个PropertyInfo使用数组.GetProperties()并在每个上调用PropertyInfo.GetValue方法

这样称呼它:

var value = prop.GetValue(o, null);
于 2011-02-03T23:56:13.503 回答