Напишите метод расширения для получения описания свойства, используя c # - PullRequest
0 голосов
/ 09 мая 2018

у меня следующий класс

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;
    }
}

Могу ли я узнать, как мне изменить тело метода, чтобы использовать метод "GetXElementName ()", как я объяснил выше.

1 Ответ

0 голосов
/ 09 мая 2018

Вам нужно использовать Выражения , чтобы достичь этого, потому что вам нужно знать член, а не значение.

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"

EDIT: другая версия, без экземпляра объекта (см. 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"
...