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

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

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

Похоже, вы говорите о методах расширения 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»), рассматриваются как обычные параметры.

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

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

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

"asdfas".MyMethod();

Используя компилятор 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
  {
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top