habe ich eine method in C# MethodennameKonnte nicht das Objekt des Typs ‚System.Linq.Expressions.UnaryExpression‘ werfen geben ‚System.Linq.Expressions.MemberExpression‘
public string GetCorrectPropertyName<T>(Expression<Func<T, string>> expression)
{
return ((MemberExpression)expression.Body).Member.Name; // Failure Point
}
und nannte es als
zu erhaltenstring lcl_name = false;
public string Name
{
get { return lcl_name ; }
set
{
lcl_name = value;
OnPropertyChanged(GetCorrectPropertyName<ThisClassName>(x => x.Name));
}
}
Dies funktioniert gut, wenn die Eigenschaft String und für alle anderen Arten gibt diese Ausnahme ist:
Konnte nicht das Objekt werfen von Geben Sie 'System.Linq.Expressions.UnaryExpression' ein, um 'System.Linq.Expressions.MemberExpression' einzugeben.
- Ich änderte Zeichenfolge in Methodensignatur zu widersprechen, aber dann wieder es funktioniert nicht.
- Ich änderte Berufung
x => x.PropertyName
-x => Convert.ToString(x.PropertyName)
und es immer noch nicht
Wo ich falsch bin?
IMO ist es besser, eine Variation davon zu verwenden, wo der Helfer einen 'Ausdruck>' nimmt. Dies ändert die Aufrufsitesyntax in 'GetCorrectPropertyName (() => this.Name)', was meiner Ansicht nach besser ist, zu tippen (es ist nicht notwendig, den generischen Typparameter anzugeben) und besser zu lesen ('this.Name' vermittelt) die Absicht extrem gut). –
Jon
@Jon: Buddy fühlen sich frei, Ihre Antwort hinzuzufügen. Wenn besser als aktuelle Antwort, werde ich auf jeden Fall Ihre akzeptieren. –
Ich würde das nicht tun wollen, weil es die Absicht Ihrer Frage an sich reißen würde. Aber Sie können den Code dafür von [hier] (http://compositewpf.codeplex.com/SourceControl/changeset/view/65392#1024364) leicht greifen, macht Microsoft genau das in Prism. – Jon