С# 3.5 частичный класс String IsNullOrWhiteSpace

Я пытаюсь создать дополнительную функциональность для класса String (IsNullOrWhitespace, как в .NET4) Но у меня проблема со ссылкой:

Ошибка 1 'String' является двусмысленной ссылкой между 'string' и 'geolis_export.Classes.String'

Я не хочу создавать метод расширения. Поскольку это произойдет, если string x = null;

Использование:

private void tbCabineNum_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    e.Handled = !e.Text.All(Char.IsNumber) || String.IsNullOrWhiteSpace(e.Text);
}

Частичная строка:

public partial class String
{
    public static bool IsNullOrWhiteSpace(string value)
    {
        if (value == null) return true;
        return string.IsNullOrEmpty(value.Trim());
    }
}

Невозможно ли создать дополнительные классы для класса String? Я попытался поместить частичное в пространство имен System, но это дает другие ошибки.

Переименование String в String2 также устраняет проблему. Но это не то, что я хочу, потому что тогда нет ссылки на исходный класс String.

Ответ 1

Это невозможно, так как класс string в .NET Framework не является частичным.
Вместо этого используйте реальный метод расширения следующим образом:

public static class StringExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        if (value == null) return true;
        return string.IsNullOrEmpty(value.Trim());
    }
}

Тогда использование будет выглядеть следующим образом:

string s = "test";
if(s.IsNullOrWhiteSpace())
    // s is null or whitespace

Как и во всех методах расширения, вызов не приведет к исключению нулевой ссылки, если строка null:

string s = null;
if(s.IsNullOrWhiteSpace()) // no exception here
    // s is null or whitespace

Причиной такого поведения является то, что компилятор переведет этот код в код IL, который эквивалентен IL-коду следующего:

string s = null;
if(StringExtensions.IsNullOrWhiteSpace(s))
    // s is null or whitespace

Ответ 2

Метод расширения должен быть определен как статический метод внутри статического класса. Также обратите внимание на ключевое слово this в параметре.

public static class MyExtensions
{
    public static bool IsNullorWhitespace(this string input)
    {
         // perform logic
    }
}

То, что вы сделали, опуская static в классе, - это определить конкурирующий класс внутри вашей сборки, а значит, двусмысленное сообщение от компилятора.

Ответ 3

Класс string не объявляется как частичный, вам придется вместо этого писать метод расширения.

Ответ 4

public static class MyExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        if (value == null) return false;
        return string.IsNullOrEmpty(value.Trim());
    }
}

Ответ 5

Чтобы создать метод расширения, вам необходимо использовать следующий синтаксис. (Обратите внимание на использование ключевого слова this):

public static bool IsNullOrWhiteSpace(this string value)

Ответ 6

Это не то, как вы создаете метод расширения. Класс не является частичным, он должен быть статическим классом и его можно назвать чем угодно (MyExtensionMethods). Вы также должны пометить свой параметр "this" по методу расширения.

Попробуйте это вместо

public static class StringExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        if (value == null) return true;
        return string.IsNullOrEmpty(value.Trim());
    }
}