Как я могу добавить этот метод как метод расширения к свойствам моего класса? - PullRequest
4 голосов
/ 18 мая 2011

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

    public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
    {
        return (propertyExpression.Body as MemberExpression).Member.Name;
    }

Я хочу использовать этот метод, как показано в следующем примере:

string propertyName = MyClass.Property1.GetPropertyName();

Возможно ли это?если да, то каково решение?

Ответы [ 4 ]

6 голосов
/ 18 мая 2011

Нет, это невозможно сделать. Не ясно, является ли MyClass именем класса (а Property1 является статическим свойством) или это свойство экземпляра, а MyClass.Property1 просто не является допустимым доступом к члену. Если это последнее, вы, вероятно, захотите изменить свой метод на что-то вроде:

public static string GetPropertyName<TSource, TResult>(
    Expression<Func<TSource, TResult>> propertyExpression)
{
    return (propertyExpression.Body as MemberExpression).Member.Name;
}

и назовите его так:

string propertyName = GetPropertyName<MyClass, string>(x => x.Property1);

Или вы можете использовать универсальный класс с универсальным методом, чтобы можно было вывести string:

string propertyName = PropertyUtil<MyClass>.GetPropertyName(x => x.Property1);

Это было бы что-то вроде:

public static class PropertyUtil<TSource>
{
    public static string GetPropertyName<TResult>(
        Expression<Func<TSource, TResult>> propertyExpression)
    {
       return (propertyExpression.Body as MemberExpression).Member.Name;
    }
}
1 голос
/ 27 мая 2011

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

Если у вас есть метод расширения для определенного типа, не имеет значения, является ли он свойством, локальной переменной или членом класса, метод расширения все еще будет доступен.

0 голосов
/ 27 мая 2011

Я явно не такой специалист, как Джон, но мне кажется, что вы хотите, и это довольно просто (вот почему я сомневаюсь, поскольку Джон явно справочный человек! ;-)):

class Program
{
    static void Main(string[] args)
    {
        MyClass<int> myClass = new MyClass<int>();
        string property1Name = myClass.Property1.GetPropertyName();
        string property2Name = myClass.Property2.GetPropertyName();
    }
}

public static class Extensions
{
    public static string GetPropertyName<T>(this Expression<Func<T>> propertyExpression)
    {
        return (propertyExpression.Body as MemberExpression).Member.Name;
    }
}

public class MyClass<T>
{
    public Expression<Func<T>> Property1; //Sample with MyClass being generic
    public Expression<Func<string>> Property2; //Sample which works anyway, MyClass being generic or not
}

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

0 голосов
/ 18 мая 2011

Нельзя создавать «статические» методы расширения.

Методы расширения являются методами «экземпляра».

Вы можете просто предоставить вспомогательный класс: -

string propertyName = PropertyHelper.GetPropertyName(() => instanceOfMyClass.Property1);
...