2010-10-29 3 views
0

Est-il possible de réécrire cette méthode d'extension sans le paramètre?Est-il possible de réécrire cette méthode d'extension délicate?

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; 
} 

Ceci est le code de test de la fonction.

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

Ceci est le résultat:

propertyName = "TEST" 

Je voudrais réécrire le code à ceci:

string propertyName = TEST.PropertyName(); 

Ps. Je ne suis pas intéressé par une version statique de cette méthode!

Pour ceux qui ne voient pas le point de cette fonction. Dans le modèle MVVM, vous avez notifié la modification d'une propriété. Comme ça.

this.RaisePropertyChanged("TEST"); 

C'est une mauvaise approche puisque le nom de la propriété est hardcoded. Avec l'aide de la méthode d'extension, vous aurez ceci:

this.RaisePropertyChanged(()=>Test); 

Je voudrais réécrire la méthode d'extension à ceci:

this.RaisePropertyChanged(Test.PropertyName()); 

est Ci-dessous un exemple de code de mon projet MVVM. (Ce qui est une propriété de modèle)

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

comment utiliseriez-vous cela? –

+0

Veuillez lire la question. "TEST.PropertyName();" –

+0

Renvoie le nom de la propriété. Ceci est utile dans le modèle MVVM. –

Répondre

1

Non, ce n'est pas possible. Le nom de la variable locale est uniquement pour le compilateur et n'est pas enregistré ou peut être renommé lors de la compilation.

Bien sûr, les propriétés sont différentes choses. Et vous devriez être conscient que votre premier exemple est différent de votre second.

Cependant, je ne vois pas comment vous pouvez implémenter cela. Et même dans ce cas, il serait beaucoup plus performant-tueur que votre travail() => PropertyName type d'invocation.

+0

Lorsque vous utilisez la réflexion, vous pouvez avoir besoin de cette fonction lorsque vous utilisez obj.GetType(). GetProperty ("PropertyName") –

Questions connexes