Como posso criar métodos de protótipo (como JavaScript) em C#.Net?

StackOverflow https://stackoverflow.com/questions/4610

  •  08-06-2019
  •  | 
  •  

Pergunta

Como é possível fazer protótipos de métodos em C#.Net?

Em JavaScript, posso fazer o seguinte para criar um método trim para o objeto string:

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}

Como posso fazer isso em C#.Net?

Foi útil?

Solução

Você não pode adicionar métodos dinamicamente a objetos ou classes existentes no .NET, exceto alterando a origem dessa classe.

Você pode, no entanto, no C# 3.0, usar métodos de extensão, que olhar como novos métodos, mas são mágicos em tempo de compilação.

Para fazer isso no seu código:

public static class StringExtensions
{
    public static String trim(this String s)
    {
        return s.Trim();
    }
}

Para usá-lo:

String s = "  Test  ";
s = s.trim();

Parece um novo método, mas será compilado exatamente da mesma maneira que este código:

String s = "  Test  ";
s = StringExtensions.trim(s);

O que exatamente você está tentando realizar?Talvez existam maneiras melhores de fazer o que você deseja?

Outras dicas

Parece que você está falando sobre os métodos de extensão do C#.Você adiciona funcionalidade às classes existentes inserindo a palavra-chave “this” antes do primeiro parâmetro.O método deve ser um método estático em uma classe estática.Strings no .NET já possuem um método "Trim", então usarei outro exemplo.

public static class MyStringEtensions
{
    public static bool ContainsMabster(this string s)
    {
        return s.Contains("Mabster");
    }
}

Então agora cada string tem um método ContainsMabster tremendamente útil, que posso usar assim:

if ("Why hello there, Mabster!".ContainsMabster()) { /* ... */ }

Observe que você também pode adicionar métodos de extensão às interfaces (por exemplo, IList), o que significa que qualquer classe que implemente essa interface também adotará esse novo método.

Quaisquer parâmetros extras que você declarar no método de extensão (após o primeiro parâmetro "this") serão tratados como parâmetros normais.

Você precisa criar um método de extensão, que requer o .NET 3.5.O método precisa ser estático, em uma classe estática.O primeiro parâmetro do método precisa ser prefixado com “this” na assinatura.

public static string MyMethod(this string input)
{
    // do things
}

Você pode então chamá-lo como

"asdfas".MyMethod();

Usando o compilador 3.5 você pode usar um método de extensão:

public static void Trim(this string s)
{
  // implementation
}

Você pode usar isso em um projeto direcionado ao CLR 2.0 (compilador 3.5) incluindo este hack:

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top