Как я могу создать прототипы методы (такие как JavaScript) в C # .NET?

голоса
15

Как это можно сделать методы прототипа в C # .NET?

В JavaScript, я могу сделать следующее, чтобы создать метод обрезки для объекта строки:

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

Как я могу идти об этом в C # .NET?

Задан 07/08/2008 в 13:00
источник пользователем
На других языках...                            


4 ответов

голоса
20

Вы не можете динамически добавлять методы к существующим объектам или классам .NET, за исключением изменения источника для этого класса.

Вы можете, однако, в C # 3.0, использование методов расширения, которые выглядят как новые методы, но время компиляции магии.

Для того, чтобы сделать это для вашего кода:

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

Для того, чтобы использовать его:

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

Это выглядит как новый метод, но будет компилировать точно так же, как этот код:

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

Что именно вы пытаетесь достичь? Может быть, есть более эффективные способы сделать то, что вы хотите?

Ответил 07/08/2008 в 13:04
источник пользователем

голоса
4

Похоже, вы говорите о методах расширения C # 's. Добавление функциональности к существующим классам, вставив «это» ключевое слово перед первым параметром. Метод должен быть статическим методом в статическом классе. Строки в .NET уже есть «Trim» метод, поэтому я буду использовать другой пример.

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

Так что теперь каждая строка имеет чрезвычайно полезный метод ContainsMabster, который я могу использовать, как это:

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

Обратите внимание, что вы также можете добавить методы расширения интерфейсов (например IList), что означает, что любой класс, реализующий этот интерфейс будет также забрать этот новый метод.

Любые дополнительные параметры, вы объявляете в методе расширения (после первого «этого» параметра), рассматриваются как нормальные параметры.

Ответил 07/08/2008 в 13:09
источник пользователем

голоса
0

Используя 3.5 компилятора вы можете использовать метод расширения:

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

Вы можете использовать это на целевой проект в CLR 2,0 (3,5 компилятора), включив в этот хак:

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
Ответил 07/08/2008 в 13:04
источник пользователем

голоса
0

Вам нужно создать метод расширения, который требует .NET 3.5. Метод должен быть статическим, в статическом классе. Первый параметр метода должен начинаться с префикса «этого» в подписи.

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

Вы можете назвать это как

"asdfas".MyMethod();
Ответил 07/08/2008 в 13:03
источник пользователем

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