Ich habe früher Methoden geschaffen, das eine Eigenschaft als Eingabe mit folgenden Syntax nehmen:Property Ausdruck in der Klasse Konstruktor, oder als Eigentum
public void MyMethod<T>(Expression<Func<T>> property) { }
public int MyProperty { get; set; }
public void SomeOtherMethod() {
MyMethod(() => MyProperty);
}
Auf diese Weise kann ich zum Beispiel warf die Eigenschaft auf einem MemberExpression
und erhalten Sie den voll qualifizierten Namen der Eigenschaft.
Ist es jedoch möglich, das gleiche in einem Klassenkonstruktor zu tun, oder eine Eigenschaft, die eine andere Eigenschaft speichert, wie die property
Variable in MyMethod()
tut?
Ich habe Folgendes versucht, aber das hat nicht funktioniert, weil der Typ Parameter in beiden Fällen nicht angegeben ist, aber ich würde nicht einmal wissen, welchen Typ zu verwenden ... vor allem, weil der Typ magisch in der abgeleitet wird oberstes Beispiel.
Im Konstruktor
public class MyClass<T> {
public MyClass(Expression<Func<T>> property) { }
}
public int MyProperty { get; set; }
var myClass = new MyClass(() => MyProperty);
Als Eigenschaft
public class MyClass<T> {
public Expression<Func<T>> SomeProperty { get; set; }
}
public int MyProperty { get; set; }
var myClass = new MyClass() { SomeProperty =() => MyProperty };
Also, wie kann ich eine Unterkunft Ausdruck in einem Konstruktor oder Eigentum seiner eigenen haben, ohne die Verwendung der Typdefinition mit ?
Das ist eine Schande, weil ich gehofft hatte, diese Syntax als eine generische für alle Arten von Eigenschaften verwenden zu können. Die Eigenschaften können alle Arten von Typen sein (string, int, double, benutzerdefinierte Klassen). Könnte ich 'object' vielleicht als Catch-All verwenden, weil der Typ an sich nicht so interessant ist, aber die' MemberExpression' der Eigenschaft ist? – GTHvidsten
Es hängt davon ab, was sonst 'MyClass' mit dem generischen Typ _does_. Wenn Sie nur "Objekt" verwenden, sehe ich nicht, warum Sie Generika überhaupt brauchen. Sie können einfach 'öffentliche Klasse MyClass { öffentliche MyClass (Ausdruck> Eigenschaft) {} }' –
Für den spezifischen Anwendungsfall, den ich jetzt entwickle, Hardcoding der Typ zu vermeiden, Generika lösen alle meine Probleme. Ich halte nicht den Atem an MS, um es in C# -47 zu implementieren;) Danke für die Klarstellung! – GTHvidsten