Частичный класс C # 3.5 String IsNullOrWhiteSpace - PullRequest
12 голосов
/ 30 июня 2011

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

Ошибка 1 «Строка» является неоднозначной ссылкой между «строкой» и «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.

Ответы [ 6 ]

44 голосов
/ 30 июня 2011

Это невозможно, потому что класс 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
6 голосов
/ 30 июня 2011

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

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

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

2 голосов
/ 30 июня 2011

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

1 голос
/ 30 июня 2011
public static class MyExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        if (value == null) return false;
        return string.IsNullOrEmpty(value.Trim());
    }
}
0 голосов
/ 30 июня 2011

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

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

public static class StringExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        if (value == null) return true;
        return string.IsNullOrEmpty(value.Trim());
    }
}
0 голосов
/ 30 июня 2011

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

public static bool IsNullOrWhiteSpace(this string value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...