2010-10-29 3 views
0

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

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 проекта. (это свойство модели)

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

как бы вы это использовали? –

+0

Пожалуйста, прочитайте вопрос. "TEST.PropertyName();" –

+0

Он возвращает имя свойства. Это полезно в шаблоне MVVM. –

ответ

1

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

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

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

+0

Когда вы используете отражение, вам может понадобиться эта функция, когда вы используете obj.GetType(). GetProperty ("PropertyName") –

Смежные вопросы