Wir alle wissen, dass Eigenschaften in C # nach einfachen alten Methoden kompiliert werden. Im Gegensatz zu Methoden (-gruppen) können sie jedoch nicht als Argumente für andere Methoden angegeben werden, die einen Delegaten wie ein Func<T>
oder Action<T>
(Getter und Setter) erwarten . Gibt es etwas Besonderes, das dies verbietet, oder ist es nur eine Funktion, die nicht "kostenlos" war, wenn Methodengruppen implizit in Delegate konvertierbar gemacht wurden?
Beispielcode:
public class MyClass
{
public static int X { get; set; }
}
private static void Foo<T>(Func<T> f)
{
Console.WriteLine(f());
}
private static void Bar<T>(Action<T> f)
{
f(default(T));
}
private static void Test()
{
// neither of these lines compile, even with an explicit type-cast.
Foo(MyClass.X);
Bar(MyClass.X);
}
Wenn ich raten müsste, würde ich sagen, dass das syntaktische Problem der Unterscheidung zwischen Aufrufen und Verweisen auf die Eigenschaft selbst keine Lösung wert war, wenn wir nur den zusätzlichen Fuzz des Schreibens () => MyClass.X
oder x => MyClass.X = x
.
set
ist ein Action
und get
ist ein Func
zum Beispiel
delegate {return SomeProperty}
geht an Getter vorbei; delegate(YourType value) {SomeProperty = value}
Setter passiert. Wenn Sie nur ein oder zwei Stellen übergeben müssen, ist dies eine Abkürzung für die umschlossenen Methoden, die Sie sonst erstellen würden.
Interface
mit dieser Eigenschaft definieren und die Signatur der aufgerufenen Methode ändern, um diese Schnittstelle als Parameter zu verwenden.