0

我定义了一个新的自定义属性 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)

有什么线索吗?

4

2 回答 2

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
于 2013-10-01T16:52:14.643 回答
1

第二种方法实际上应该是:

   GetXPath<Appointment, long>(x => x.Id); // appt/@id
于 2013-10-28T03:06:49.943 回答