我已经定义了一个新的自定义属性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)
任何线索?
答案 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