С# 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());
}
}