使用c#编写扩展方法以检索属性描述

时间:2018-05-09 07:15:06

标签: c# c#-4.0 c#-3.0

我有以下课程

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;像我上面解释的使用方法。

1 个答案:

答案 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"