C # tem propriedades de extensão?
Por exemplo, posso adicionar uma propriedade de extensão DateTimeFormatInfo
chamada ShortDateLongTimeFormat
que retornaria ShortDatePattern + " " + LongTimePattern
?
c#
properties
extension-methods
Svish
fonte
fonte
?
enum
que podem ter propriedades e métodos. Os c #enum
não podem ter propriedades ou métodos, mas você pode criar métodos de extensão neles. Esta pergunta foi útil para mim e não deve ser encerrada.Respostas:
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 :
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:
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 pelofor
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:
Isso pode ser visto em uma divisão da proposta anterior em dois casos de uso. A nova sintaxe para extensão seria assim:
então você seria capaz de fazer isso:
E para uma interface estática :
Adicionar uma propriedade de extensão em
int
e tratar oint
comoIMonoid<int>
:fonte
Não, eles não existem no C # 3.0 e não serão adicionados no 4.0. Está na lista de recursos desejados para C #, para que possa ser adicionado em uma data futura.
Neste ponto, o melhor que você pode fazer é os métodos de extensão no estilo GetXXX.
fonte
Não, eles não existem.
Eu sei que a equipe de C # estava considerando-os em um ponto (ou pelo menos Eric Lippert estava) - junto com construtores e operadores de extensão (eles podem levar um tempo para se entender, mas são legais ...) No entanto, eu não vi alguma evidência de que eles farão parte do C # 4.
EDIT: Eles não apareceram no C # 5 e, em julho de 2014, não parece que também esteja no C # 6.
Eric Lippert , desenvolvedor principal da equipe de compiladores C # da Microsoft até novembro de 2012, escreveu sobre isso em outubro de 2009:
fonte
()
final é muito mais legível. Eu sei pessoalmente, pelo menos 90% das extensões que escrevo são desses dois tipos.FullName
=FirstName + LastName
,ShortName
=FirstName + LastName[0]
. Gostaria de adicionar mais dessas propriedades, mas não quero "sujar" as classes reais. Nesse caso, uma propriedade de extensão, somente leitura, é perfeita porque eu posso adicionar a funcionalidade, manter a classe principal limpa e ainda expor as informações que quero expor na interface do usuário.static implicit operator FileInfo(FileInfoEx fex)
quais retornos do meu objeto FileInfo contido. Isso efetivamente me permite tratar o FileInfoEx como se ele fosse herdado do FileInfo, mesmo que essa classe esteja selada.Atualização (obrigado a @chaost por apontar esta atualização):
Fonte: seção de comentários em https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/
Parei de contar quantas vezes, ao longo dos anos, abri esta questão com a esperança de ver isso sendo implementado.
Bem, finalmente todos podemos nos alegrar! A Microsoft apresentará isso em seu próximo lançamento do C # 8.
Então, ao invés de fazer isso ...
Finalmente seremos capazes de fazê-lo assim ...
Fonte: https://blog.ndepend.com/c-8-0-features-glimpse-future/
fonte
Como o @Psyonity mencionou, você pode usar o condicionalWeakTable para adicionar propriedades aos objetos existentes. Combinado com o dinâmico ExpandoObject, você pode implementar propriedades de extensão dinâmica em algumas linhas:
Um exemplo de uso está nos comentários xml:
fonte
Como recentemente precisei disso, procurei a fonte da resposta em:
estender a classe c # adicionando propriedades
e criou uma versão mais dinâmica:
Provavelmente, pode ser muito melhorado (nomeação, dinâmico em vez de string), atualmente eu o uso no CF 3.5 junto com uma ConditionalWeakTable hacky ( https://gist.github.com/Jan-WillemdeBruyn/db79dd6fdef7b9845e217958db98c4d4 )
fonte