




Вам необходимо создать метод расширения, для которого требуется .NET 3.5. Метод должен быть статическим в статическом классе. Первый параметр метода должен иметь префикс «this» в подписи.
public static string MyMethod(this string input)
{
// do things
}
Затем вы можете назвать это как
"asdfas".MyMethod();
Вы не можете динамически добавлять методы к существующим объектам или классам в .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);
Чего именно вы пытаетесь достичь? Может быть, есть лучшие способы делать то, что вы хотите?
Используя компилятор 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
{
}
}
Похоже, вы говорите о методах расширения 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), обрабатываются как обычные параметры.
Спасибо, Лассевк, отличный ответ :) В ответ на «Чего именно ты пытаешься достичь?». Время от времени мне нужно манипулировать строкой или другим объектом. Вместо того, чтобы вызывать функцию для этого, я бы подумал, что лучше вызвать ее как метод. В настоящее время я пишу веб-приложения на Asp.net, и я еще не думаю, что Asp.net 3.x есть, поэтому мне придется подождать. Но спасибо за ответ.