Todos sabemos que las propiedades en C # se compilan con métodos antiguos simples y reales. Pero a diferencia del método (-group) s, no se pueden dar como argumentos a otros métodos que esperan un delegado como a Func<T>
o Action<T>
(getter y setter). ¿Hay algo especial que lo prohíba, o es solo una característica que no vino "gratis" cuando los grupos de métodos se convirtieron implícitamente en delegados?
Código de ejemplo:
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);
}
Si tuviera que adivinar, diría que no valía la pena resolver el problema sintáctico de diferenciar entre invocaciones y referencias a la propiedad en sí, cuando simplemente podemos hacer la falta adicional de escritura () => MyClass.X
o x => MyClass.X = x
.
set
es un Action
y get
es un Func
por ejemplo
delegate {return SomeProperty}
pasa getter; delegate(YourType value) {SomeProperty = value}
pasa setter. Si solo necesita pasar uno o dos lugares, esta es una forma abreviada de los métodos ajustados que de otro modo crearía.
Interface
con esa propiedad y cambiar la firma del método llamado para tomar esa interfaz como parámetro.