我有以下课程
public class Device
{
[XmlElement("MobileDeviceType")]
public string DeviceType { get; set; }
}
我需要名为" GetXElementName()"的扩展方法我需要使用下面的方法。
string propertyDescription = (new Device()).DeviceType.GetXElementName(); // this shoud return "MobileDeviceType"
作为一个例子
public static class ExtensionMethods
{
public static string GetXElementName<T>(this T source)
{
PropertyInfo prop = source.GetType().GetProperty(source.ToString());
string desc = prop.Name;
object[] attrs = prop.GetCustomAttributes(true);
object attr = attrs[0];
XmlElementAttribute descAttr = attr as XmlElementAttribute;
if (descAttr != null)
{
desc = descAttr.ElementName;
}
return desc;
}
}
我是否可以知道如何修改方法体以使用&#34; GetXElementName()&#34;像我上面解释的使用方法。
答案 0 :(得分:2)
您需要使用表达式来实现这一目标,因为您需要知道成员,而不是价值。
public static class Extensions
{
public static string GetXmlElementName<T, TProperty>(this T obj, Expression<Func<T, TProperty>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
return string.Empty;
var xmlElementAttribute = memberExpression.Member.GetCustomAttribute<XmlElementAttribute>();
if (xmlElementAttribute == null)
return string.Empty;
return xmlElementAttribute.ElementName;
}
}
用法:
public class MyClass
{
[XmlElement(ElementName = "Test")]
public string MyProperty { get; set; }
}
new MyClass().GetXmlElementName(x => x.MyProperty) // output "Test"
编辑:另一个版本,没有对象实例(请参阅Nyerguds评论)
我想最优雅的方法是使用泛型方法创建泛型类,因此您可以通过仅指定T
类型参数来调用它(TProperty
是隐式的)。
public class GetXmlElementName<T>
{
public static string From<TProperty>(Expression<Func<T, TProperty>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
return string.Empty;
var xmlElementAttribute = memberExpression.Member.GetCustomAttribute<XmlElementAttribute>();
if (xmlElementAttribute == null)
return string.Empty;
return xmlElementAttribute.ElementName;
}
}
用法:
GetXmlElementName<MyClass>.From(x => x.MyProperty) // output "Test"