No momento, ele ainda não é suportado imediatamente pelo compilador Roslyn ...
Até agora, as propriedades da extensão não eram vistas como valiosas o suficiente para serem incluídas nas versões anteriores do padrão C #. O C # 7 e o C # 8.0 viram isso como defensor da proposta, mas ainda não foi lançado, principalmente porque, mesmo que já exista uma implementação, eles querem fazê-lo desde o início.
Mas vai ...
Há um item de membros de extensão na lista de trabalho do C # 7, portanto ele pode ser suportado no futuro próximo. O status atual da propriedade de extensão pode ser encontrado no Github, no item relacionado .
No entanto, há um tópico ainda mais promissor, que é o "estender tudo", com foco principalmente nas propriedades e nas classes estáticas ou mesmo nos campos.
Além disso, você pode usar uma solução alternativa
Conforme especificado neste artigo , você pode usar o TypeDescriptor
recurso para anexar um atributo a uma instância de objeto em tempo de execução. No entanto, ele não está usando a sintaxe das propriedades padrão.
É um pouco diferente do açúcar sintático, acrescentando a possibilidade de definir uma propriedade estendida
string Data(this MyClass instance)
como um alias para o método de extensão,
string GetData(this MyClass instance)
pois ele armazena dados na classe.
Espero que o C # 7 forneça uma extensão com todos os recursos (propriedades e campos); no entanto, nesse ponto, apenas o tempo dirá.
E sinta-se à vontade para contribuir, pois o software de amanhã virá da comunidade.
Atualização: agosto de 2016
Como a equipe dotnet publicou o que há de novo no C # 7.0 e a partir de um comentário de Mads Torgensen :
Propriedades da extensão: um estagiário (brilhante!) As implementou durante o verão como um experimento, junto com outros tipos de membros da extensão. Continuamos interessados nisso, mas é uma grande mudança e precisamos nos sentir confiantes de que vale a pena.
Parece que as propriedades de extensão e outros membros ainda são bons candidatos para serem incluídos em uma versão futura do Roslyn, mas talvez não a versão 7.0.
Atualização: maio de 2017
Os membros da extensão foram encerrados como duplicado do problema de extensão de tudo que também foi fechado. A discussão principal foi de fato sobre a extensibilidade do tipo em um sentido amplo. O recurso agora é rastreado aqui como uma proposta e foi removido do marco 7.0 .
Atualização: agosto de 2017 - recurso proposto em C # 8.0
Embora continue sendo apenas um recurso proposto , agora temos uma visão mais clara do que seria sua sintaxe. Lembre-se de que essa também será a nova sintaxe para os métodos de extensão:
public interface IEmployee
{
public decimal Salary { get; set; }
}
public class Employee
{
public decimal Salary { get; set; }
}
public extension MyPersonExtension extends Person : IEmployee
{
private static readonly ConditionalWeakTable<Person, Employee> _employees =
new ConditionalWeakTable<Person, Employee>();
public decimal Salary
{
get
{
// `this` is the instance of Person
return _employees.GetOrCreate(this).Salary;
}
set
{
Employee employee = null;
if (!_employees.TryGetValue(this, out employee)
{
employee = _employees.GetOrCreate(this);
}
employee.Salary = value;
}
}
}
IEmployee person = new Person();
var salary = person.Salary;
Semelhante às classes parciais, mas compilado como uma classe / tipo separado em um assembly diferente. Observe que você também poderá adicionar membros e operadores estáticos dessa maneira. Como mencionado no podcast de Mads Torgensen , a extensão não terá nenhum estado (portanto, não pode adicionar membros da instância privada à classe), o que significa que você não poderá adicionar dados de instância privada vinculados à instância . A razão invocada para isso é que implicaria gerenciar dicionários internamente e poderia ser difícil (gerenciamento de memória, etc ...). Para isso, você ainda pode usar a técnica TypeDescriptor
/ ConditionalWeakTable
descrita anteriormente e, com a extensão da propriedade, a oculta sob uma propriedade legal.
A sintaxe ainda está sujeita a alterações, pois implica esse problema . Por exemplo, extends
poderia ser substituído pelo for
qual alguns podem parecer mais naturais e menos relacionados ao java.
Atualização dezembro de 2018 - Funções, extensões e membros da interface estática
A extensão de tudo não chegou ao C # 8.0, devido a algumas desvantagens explicadas como o final desse ticket do GitHub . Então, houve uma exploração para melhorar o design. Aqui , Mads Torgensen explica quais são os papéis e extensões e como eles diferem:
As funções permitem que as interfaces sejam implementadas em valores específicos de um determinado tipo. As extensões permitem que interfaces sejam implementadas em todos os valores de um determinado tipo, dentro de uma região específica do código.
Isso pode ser visto em uma divisão da proposta anterior em dois casos de uso. A nova sintaxe para extensão seria assim:
public extension ULongEnumerable of ulong
{
public IEnumerator<byte> GetEnumerator()
{
for (int i = sizeof(ulong); i > 0; i--)
{
yield return unchecked((byte)(this >> (i-1)*8));
}
}
}
então você seria capaz de fazer isso:
foreach (byte b in 0x_3A_9E_F1_C5_DA_F7_30_16ul)
{
WriteLine($"{e.Current:X}");
}
E para uma interface estática :
public interface IMonoid<T> where T : IMonoid<T>
{
static T operator +(T t1, T t2);
static T Zero { get; }
}
Adicionar uma propriedade de extensão em int
e tratar o int
como IMonoid<int>
:
public extension IntMonoid of int : IMonoid<int>
{
public static int Zero => 0;
}