Как я могу добавить этот метод в качестве метода расширения к свойствам моего класса?

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

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

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

string propertyName = MyClass.Property1.GetPropertyName();

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


person masoud ramezani    schedule 18.05.2011    source источник


Ответы (4)


Нет, это невозможно сделать. Неясно, является ли 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;
    }
}
person Jon Skeet    schedule 18.05.2011

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

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

person jmoreno    schedule 27.05.2011

Вы не можете создавать "статические" методы расширения.

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

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

string propertyName = PropertyHelper.GetPropertyName(() => instanceOfMyClass.Property1);
person BenCr    schedule 18.05.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
}

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

person Ssithra    schedule 27.05.2011
comment
Мой класс — это простой класс с простыми свойствами, которые имеют простой тип, например int или bool. В вашем классе это свойство не простое; - person masoud ramezani; 28.05.2011
comment
В исходном сообщении входной параметр propertyExpression функции GetPropertyName имел тип Expression<Func<T>>. Вот почему я воспроизвел такие типы свойств в своем образце. Если это не то, что вы хотите, я, должно быть, что-то пропустил. Я думаю, что я, наконец, не понимаю вашего вопроса... - person Ssithra; 28.05.2011