Нахождение имени определенного свойства класса из класса в C # 3.5 - PullRequest
0 голосов
/ 16 февраля 2010

Дайте класс, как показано ниже, как я могу найти название одного конкретного свойства?

public class Student
{
    public int Grade
    {
        get;
        set;
    }

    public string TheNameOfTheGradeProperty
    {
        get
        {
            return ????
        }
    }

    // More properties..    
}

Так что я хотел бы вернуть строку "Grade" из свойства TheNameOfTheGradeProperty. Причина, по которой я спрашиваю, состоит в том, что я не хочу использовать жестко закодированную строку, а скорее лямбда-выражение или что-то еще.

Как я могу добиться этого?

Ответы [ 3 ]

2 голосов
/ 16 февраля 2010

Можно использовать выражение для поиска имени свойства, используя простой метод расширения, который можно использовать для любого объекта ... если вам нужно ограничить его набором объектов, вы можете применить общее ограничение на Т. Надеюсь, это поможет

public class Student
{
    public int Grade { get; set;}
    public string Name { get; set; }

    public string GradePropertyName
    {
        get { return this.PropertyName(s => s.Grade); }
    }

    public string NamePropertyName
    {
        get { return this.PropertyName(s => s.Name); }
    }
}

public static class Helper
{
    public static string PropertyName<T, TProperty>(this T instance, Expression<Func<T, TProperty>> expression)
    {
        var property = expression.Body as MemberExpression;

        if (property != null)
        {
            var info = property.Member as PropertyInfo;
            if (info != null)
            {
                return info.Name;
            }
        }

        throw new ArgumentException("Expression is not a property");
    }
}
1 голос
/ 16 февраля 2010

У вас очень странный запрос. Вы хотите сказать, что не хотите использовать жестко запрограммированную строку, потому что хотите, чтобы TheNameOfTheGradeProperty оставался в курсе, если вы проведете рефакторинг класса? Если это так, вот странный способ сделать это:

public class Student
{
    public int Grade { get; set; }

    public string TheNameOfTheGradeProperty
    {
        get
        {
            Expression<Func<int>> gradeExpr = () => this.Grade;
            MemberExpression body = gradeExpr.Body as MemberExpression;
            return body.Member.Name;
        }
    }
}
1 голос
/ 16 февраля 2010
using System.Reflection;

return typeof(Student).GetProperty("Grade").Name;

Но, как вы можете видеть, вы не так далеко впереди, используя отражение (таким образом), потому что строка "Grade" все еще жестко закодирована, что означает, что в этом сценарии она более эффективна, чем return "Grade".


Одна вещь, которую мне нравится делать, - это создавать и добавлять пользовательский атрибут к члену следующим образом. Следующее не позволяет использовать жестко закодированную строку «Grade».

public class Student {

// TAG MEMBER WITH CUSTOM ATTRIBUTE
[GradeAttribute()]
public int Grade
{
    get;
    set;
}

public string TheNameOfTheGradeProperty
{
    get
    {
        /* Use Reflection.
           Loop over properties of this class and return the
           name of the one that is tagged with the 
           custom attribute of type GradeAttribute.
        */
    }
}

// More properties..    

} 

Создание пользовательских атрибутов можно найти здесь .

...