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

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

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

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

Как я могу сделать это в C # .Net?

7.08.2008 12:00:50
4 ОТВЕТА
РЕШЕНИЕ

Вы не можете динамически добавлять методы к существующим объектам или классам в .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);

Что именно вы пытаетесь достичь? Возможно, есть лучшие способы делать то, что вы хотите?

22
7.08.2008 12:04:11
Спасибо Lassevk, отличный ответ :) В ответ на вопрос «Что именно вы пытаетесь достичь?». Время от времени мне нужно манипулировать строкой или другим объектом. Вместо того чтобы вызывать функцию для этого, я бы подумал, что лучше вызывать ее как метод. В настоящее время я пишу веб-приложения на Asp.net и пока не думаю, что Asp.net 3.x, поэтому мне придется подождать. Но спасибо за ваш ответ.
GateKiller 7.08.2008 12:19:50

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

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

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

"asdfas".MyMethod();
0
7.08.2008 12:03:42

Используя компилятор 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
  {
  }
}
0
7.08.2008 13:15:19

Похоже, вы говорите о методах расширения C #. Вы добавляете функциональность в существующие классы, вставляя ключевое слово «this» перед первым параметром. Метод должен быть статическим методом в статическом классе. Строки в .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), что означает, что любой класс, реализующий этот интерфейс, также получит этот новый метод.

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

5
7.08.2008 12:13:53