问题 从自定义属性装饰属性获取价值?


我编写了一个我在类的某些成员上使用的自定义属性:

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 - 对象与目标类型不匹配。如何构建此调用以获取此值?


3873
2018-02-03 23:54


起源



答案:


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

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

还有一件事 - 你应该使用notFirst(),但是.FirstOrDefault(),因为你的代码会抛出异常,如果某些属性不包含任何属性:

object attr = (from row in propattr 
               where row.GetType() == typeof(MyAttribute) 
               select row)
              .FirstOrDefault();

11
2018-02-04 08:28



同意FirstOrDefault - 这主要是一个展示问题的人为例子,但感谢你的帮助。呃,简直不敢相信。 - Joe


答案:


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

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

还有一件事 - 你应该使用notFirst(),但是.FirstOrDefault(),因为你的代码会抛出异常,如果某些属性不包含任何属性:

object attr = (from row in propattr 
               where row.GetType() == typeof(MyAttribute) 
               select row)
              .FirstOrDefault();

11
2018-02-04 08:28



同意FirstOrDefault - 这主要是一个展示问题的人为例子,但感谢你的帮助。呃,简直不敢相信。 - Joe


你得到了一些 PropertyInfo 运用 .GetProperties() 并打电话 PropertyInfo.GetValue 每个方法

这样称呼它:

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

3
2018-02-03 23:56



澄清; OP需要一个Dummy类的实例才能从中获取属性值。 Type本身是不够的。 - KeithS
我已经更新了我的问题 - 我的问题正好与.GetValue以及如何调用它以便它实际上有效。 - Joe
@Joe看到更新 - Andrey