Todos sabemos que as propriedades em C # são compiladas para métodos antigos simples e reais. Mas, diferentemente dos métodos (-group) s, eles não podem ser dados como argumentos para outros métodos que esperam um delegado como a Func<T>
ou Action<T>
(getter e setter). Existe algo especial que proíba isso ou é apenas um recurso que não veio "de graça" ao tornar os grupos de métodos implicitamente conversíveis em delegados?
Código de exemplo:
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);
}
Se eu tivesse que adivinhar, eu diria que o problema sintático de diferenciar entre invocações e referências à propriedade em si não valia a pena resolver quando podemos apenas fazer a confusão extra de escrever () => MyClass.X
ou x => MyClass.X = x
.
set
é um Action
e get
é um Func
, por exemplo,
delegate {return SomeProperty}
passa getter; delegate(YourType value) {SomeProperty = value}
passa setter. Se você precisar passar apenas por um ou dois lugares, esta é uma abreviação para os métodos agrupados que você criaria.
Interface
com essa propriedade e alterar a assinatura do método chamado para usar essa interface como parâmetro.