ho creato un method in C# per ottenere methodnameImpossibile eseguire il cast oggetto di tipo 'System.Linq.Expressions.UnaryExpression' digitare 'System.Linq.Expressions.MemberExpression'
public string GetCorrectPropertyName<T>(Expression<Func<T, string>> expression)
{
return ((MemberExpression)expression.Body).Member.Name; // Failure Point
}
e chiamando come
string lcl_name = false;
public string Name
{
get { return lcl_name ; }
set
{
lcl_name = value;
OnPropertyChanged(GetCorrectPropertyName<ThisClassName>(x => x.Name));
}
}
questo funziona bene se la proprietà è di stringa e per tutti gli altri tipi dà questa eccezione:
Impossibile eseguire il cast oggetto di digitare 'System.Linq.Expressions.UnaryExpression' per digitare 'System.Linq.Expressions.MemberExpression'.
- ho cambiato stringa di opporsi in firma del metodo, ma poi fallisce di nuovo.
- ho cambiato vocazione
x => x.PropertyName
-x => Convert.ToString(x.PropertyName)
e non riesce ancora
Dove sbaglio?
IMO è meglio usare una variante di questo in cui l'helper prende un 'Expression>'. Questo cambia la sintassi del sito di chiamata in 'GetCorrectPropertyName (() => this.Name)', che a mio modo di vedere è sia meglio scrivere (non c'è bisogno di dare il parametro di tipo generico) e meglio leggere ('this.Name' convoglia l'intento estremamente bene). –
Jon
@Jon: Buddy sentiti libero di aggiungere la tua risposta. Se migliore della risposta attuale, accetterò sicuramente la tua. –
Non vorrei farlo perché usurperebbe l'intento della tua domanda. Ma puoi facilmente prendere il codice per questo da [qui] (http://compositewpf.codeplex.com/SourceControl/changeset/view/65392#1024364), Microsoft fa esattamente questo in Prism. – Jon