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

votos
15

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

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

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

Como posso ir sobre como fazer isso em C # .net?

Publicado 07/08/2008 em 13:00
fonte usuário
Em outras línguas...                            


4 respostas

votos
20

Você não pode adicionar dinamicamente métodos para objetos ou classes existentes em .NET, exceto alterando a fonte para essa classe.

Você pode, no entanto, em C # 3.0, métodos de extensão de uso, que se parecem como novos métodos, mas são em tempo de compilação magia.

Para fazer isso para o 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();

Este parece ser um novo método, mas irá compilar da mesma maneira exata como este código:

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

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

Respondeu 07/08/2008 em 13:04
fonte usuário

votos
4

Parece que você está falando Métodos C # 's de extensão. Você adicionar funcionalidade às classes existentes, inserindo o "esta" palavra-chave antes do primeiro parâmetro. O método tem de ser um método estático em uma classe estática. Cordas em .NET já tem um método "Trim", então eu vou usar outro exemplo.

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

Portanto, agora cada corda tem um método ContainsMabster tremendamente útil, que eu possa usar como esta:

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

Note que você também pode adicionar métodos de extensão para as interfaces (por exemplo IList), o que significa que qualquer classe que implementa essa interface também irá pegar esse novo método.

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

Respondeu 07/08/2008 em 13:09
fonte usuário

votos
0

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 CLR 2.0 alvo (3,5 compilador), incluindo este truque:

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
Respondeu 07/08/2008 em 13:04
fonte usuário

votos
0

Você precisa criar um método de extensão, o que requer .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 "este" na assinatura.

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

Você pode, em seguida, chamá-lo assim

"asdfas".MyMethod();
Respondeu 07/08/2008 em 13:03
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more