如何从属性引用中检索自定义属性值。

时间:2013-10-01 16:49:13

标签: c# reflection extension-methods custom-attributes

我已经定义了一个新的自定义属性XPath,并将该属性应用于我的类的各种属性

public class Appointment
{
    [XPath("appt/@id")]
    public long Id { get; set; }

    [XPath("appt/@uid")]
    public string UniqueId { get; set; }
}

我知道如何反对整个类来检索所有属性,但我想要一种方法来反映特定属性(最好不传递属性的字符串名称)

最理想的是,我可以创建一个扩展方法(或其他类型的帮助程序),这将允许我执行以下操作之一:

appointment.Id.Xpath();

GetXpath(appointment.Id)

任何线索?

2 个答案:

答案 0 :(得分:2)

您可以执行此操作以获取与属性关联的XPathAttribute

var attr = (XPathAttribute)typeof(Appointment)
               .GetProperty("Id")
               .GetCustomAttributes(typeof(XPathAttribute), true)[0];

你可以使用这样的Expression将它包装在一个方法中:

public static string GetXPath<T>(Expression<Func<T>> expr)
{
    var me = expr.Body as MemberExpression;
    if (me != null)
    {
        var attr = (XPathAttribute[])me.Member.GetCustomAttributes(typeof(XPathAttribute), true);
        if (attr.Length > 0)
        {
            return attr[0].Value;
        }
    }
    return string.Empty;
}

并称之为:

Appointment appointment = new Appointment();
GetXPath(() => appointment.Id)  // appt/@id

或者,如果您希望能够在没有要引用的对象实例的情况下调用它:

public static string GetXPath<T, TProp>(Expression<Func<T, TProp>> expr)
{
    var me = expr.Body as MemberExpression;
    if (me != null)
    {
        var attr = (XPathAttribute[])me.Member.GetCustomAttributes(typeof(XPathAttribute), true);
        if (attr.Length > 0)
        {
            return attr[0].Value;
        }
    }
    return string.Empty;
}

并称之为:

GetXPath<Appointment>(x => x.Id); // appt/@id

答案 1 :(得分:1)

第二种方法实际应该是:

   GetXPath<Appointment, long>(x => x.Id); // appt/@id