Можно ли переписать этот хитрый метод расширения? - PullRequest
0 голосов
/ 29 октября 2010

Можно ли переписать этот метод расширения без параметра?

public static string PropertyName<T>(this T obj, Expression<Func<T>> property)
{
    var memberExpression = property.Body as MemberExpression;
    if (memberExpression == null)
        throw new ArgumentException("Expression must be a MemberExpression.", "property");
    return memberExpression.Member.Name;
}

Это тестовый код для функции.

string TEST = Guid.NewGuid().ToString();
string propertyName = TEST.PropertyName(() => TEST);

Эторезультат:

propertyName = "TEST"

Я хотел бы переписать код так:

string propertyName = TEST.PropertyName();

Ps.Меня не интересует статическая версия этого метода!

Для тех, кто не видит смысла в этой функции.В шаблоне MVVM вы уведомили об изменении свойства.Вот так.

this.RaisePropertyChanged("TEST");

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

this.RaisePropertyChanged(()=>Test);

Я хотел бы переписать метод расширения следующим образом:

this.RaisePropertyChanged(Test.PropertyName());

Ниже приведен пример кода из моего проекта MVVM.(это свойство Model)

public DateTime Start
{
    get { return WorkModel.Start; }
    set
    {
        if (WorkModel.Start != value)
        {
            WorkModel.Start = new DateTime(SelectedDate.Year, SelectedDate.Month, SelectedDate.Day, value.Hour, value.Minute, value.Second);
            this.RaisePropertyChanged("Start");
            this.RaisePropertyChanged("TotalWork");
        }
    }
}

1 Ответ

1 голос
/ 29 октября 2010

Нет, это невозможно.Имя локальной переменной предназначено только для компилятора и не записывается или может быть переименовано во время компиляции.

Конечно, свойства - это другое.И вы должны знать, что ваш первый пример отличается от вашего второго.

Тем не менее, я не вижу способа, которым вы можете реализовать это.И даже в этом случае производительность будет намного ниже, чем ваш рабочий вызов () => PropertyName.

...