Os métodos de extensão podem ser aplicados à classe?
Por exemplo, estenda DateTime para incluir um método Tomorrow () que poderia ser invocado como:
DateTime.Tomorrow();
Eu sei que posso usar
static DateTime Tomorrow(this Datetime value) { //... }
Ou
public static MyClass {
public static Tomorrow() { //... }
}
para um resultado semelhante, mas como posso estender DateTime para poder invocar DateTime.Tomorrow?
c#
extension-methods
David Glenn
fonte
fonte
Use um método de extensão .
Ex:
Uso:
ou
fonte
DateTime.Tomorrow()
como métodos de extensão funcionam apenas em INSTÂNCIAS de uma classe e em uma estrutura de classe. Para "estender" um método estático em uma estrutura de classe, siga a resposta de Andrew ou a resposta de Shuggy .Os métodos de extensão são açúcares sintáticos para fazer métodos estáticos cujo primeiro parâmetro é uma instância do tipo T pareçam ser um método de instância em T.
Como tal, o benefício é amplamente perdido quando você faz 'métodos de extensão estáticos', pois eles serviriam para confundir o leitor do código ainda mais do que um método de extensão (uma vez que eles parecem ser totalmente qualificados, mas não são realmente definidos nessa classe) para nenhum ganho sintático (ser capaz de encadear chamadas em um estilo fluente no Linq, por exemplo).
Já que você teria que trazer as extensões para o escopo com um uso de qualquer maneira, eu diria que é mais simples e seguro criar:
E use isso em seu código por meio de:
fonte
O mais próximo que posso chegar da resposta é adicionando um método de extensão a um
System.Type
objeto. Não é bonito, mas ainda assim interessante.Caso contrário, IMO Andrew e ShuggyCoUk tem uma implementação melhor.
fonte
Type
pode ser substituído por qualquer outro tipo necessário. Eu uso comFrom
ele e funciona perfeitamente. então acho que essa resposta é geral, mas corretaEu faria o mesmo que Kumu
mas chame-o assim novo DateTime (). Tomorrow ();
Acho que faz mais seens do que DateTime.Now.Tomorrow ();
fonte
Eles fornecem a capacidade de estender tipos existentes, adicionando novos métodos sem modificações necessárias para o tipo. Chamar métodos de objetos do tipo estendido em um aplicativo usando a sintaxe de método de instância é conhecido como métodos de '' extensão ''. Os métodos de extensão não são membros de instância no tipo. O ponto principal a ser lembrado é que os métodos de extensão, definidos como métodos estáticos, estão no escopo apenas quando o namespace é importado explicitamente para o código-fonte do aplicativo por meio da diretiva using. Mesmo que os métodos de extensão sejam definidos como métodos estáticos, eles ainda são chamados usando a sintaxe de instância.
Verifique o exemplo completo aqui http://www.dotnetreaders.com/articles/Extension_methods_in_C-sharp.net,Methods_in_C_-sharp/201
Exemplo:
fonte
Eu estava procurando por algo semelhante - uma lista de restrições em classes que fornecem Métodos de Extensão. Parece difícil encontrar uma lista concisa, então aqui vai:
Você não pode ter nada privado ou protegido - campos, métodos, etc.
Deve ser uma classe estática, como em
public static class...
.Apenas métodos podem estar na classe e todos devem ser public static.
Você não pode ter métodos estáticos convencionais - aqueles que não incluem este argumento não são permitidos.
Todos os métodos devem começar:
public static ReturnType MethodName (this ClassName _this, ...)
Portanto, o primeiro argumento é sempre a referência this.
Isso cria um problema implícito - se você adicionar métodos que exigem um bloqueio de qualquer tipo, não poderá realmente fornecê-lo no nível da classe. Normalmente, você forneceria um bloqueio de nível de instância privado, mas não é possível adicionar nenhum campo privado, deixando você com algumas opções muito estranhas, como fornecê-lo como um estático público em alguma classe externa, etc. Torna-se perigoso. Sinais de que a linguagem C # teve uma espécie de má evolução no design desses .
A solução alternativa é usar sua classe Extension Method apenas como uma fachada para uma classe regular, e todos os métodos estáticos em sua classe Extension apenas chamam a classe real, provavelmente usando um Singleton .
fonte
Infelizmente, você não pode fazer isso. Eu acredito que seria útil, no entanto. É mais natural digitar:
do que:
Com uma classe Util, você deve verificar a existência de um método estático em duas classes diferentes, ao invés de uma.
fonte
Melhoramos nossa resposta com uma explicação detalhada. Agora é mais fácil entender sobre o método de extensão
Método de extensão : É um mecanismo pelo qual podemos estender o comportamento da classe existente sem usar a subclasse ou modificar ou recompilar a classe ou estrutura original.
Podemos estender nossas classes personalizadas, classes de estrutura .net etc.
O método de extensão é, na verdade, um tipo especial de método estático definido na classe estática.
Como a
DateTime
classe já foi feita acima e, portanto, não usamos esta classe para a explicação.Abaixo está o exemplo
// Esta é uma classe Calculadora existente que tem apenas um método (Adicionar)
fonte