Как создать метод расширения для ToString?
Я пробовал это:
public static class ListHelper
{
public static string ToString<T>(this IList<String> list)
{
return string.Join(", ", list.ToArray());
}
public static string ToString<T>(this String[] array)
{
return string.Join(", ", array);
}
}
Но это не работает, как для string[]
, так и для List<string>
. Может быть, мне нужны специальные аннотации?
Ответы
Ответ 1
Методы расширения проверяются только в том случае, если нет подходящих методов-кандидатов, которые соответствуют. В случае вызова ToString()
всегда будет применимый метод кандидата, а именно ToString()
on object
. Целью методов расширения является расширение набора доступных методов по типу, а не переопределение существующих методов; поэтому их называют "методами расширения". Если вы хотите переопределить существующий метод, вам придется сделать переопределяющий метод.
Ответ 2
Похоже, вы хотите заменить то, что возвращает files.ToString()
. Вы не сможете этого сделать, не создавая собственный класс, чтобы назначить files
as (например, наследовать из списка и переопределить ToString()
.)
Во-первых, избавиться от общего типа (<T>
), вы его не используете. Затем вам нужно будет переименовать метод расширения, потому что вызов files.ToString()
просто вызовет метод List ToString.
Это делает то, что вы ищете.
static class Program
{
static void Main()
{
var list = new List<string> { {"a"}, {"b"}, {"c"} };
string str = list.ToStringExtended();
}
}
public static class ListHelper
{
public static string ToStringExtended(this IList<String> list)
{
return string.Join(", ", list.ToArray());
}
}
Ответ 3
Просто Нельзя использовать имя ToString
для метода расширения, поскольку он никогда не будет вызван, потому что этот метод уже существует и вы должны " t используйте T
, поскольку он бесполезен там.
Например, я попробовал это, и снова он возвратил то же самое:
Console.WriteLine(lst.ToString<int>());
выход:
shekhar, shekhar, shekhar, shekhar
так что на этот раз я использовал int
, и он все еще выполнялся, потому что T не имеет смысла, а затем меняет прототип метода.
Итак, почему вы используете ToString
Literal в качестве имени метода, поскольку он уже существует, и вы не можете переопределить его в методе расширения, поэтому вы должны использовать этот T
, чтобы сделать его общим. Используйте другое имя, например
public static string ToMyString(this IList<String> list)
Таким образом, вам не нужно было бы использовать общий, поскольку он бесполезен там, и вы могли бы просто называть его, как всегда.
Это говорит о том, что ваш код работает на меня. вот что я пробовал (в LINQPAD):
void Main()
{
List<string> lst = new List<string>();
lst.Add("shekhar");
lst.Add("shekhar");
lst.Add("shekhar");
lst.Add("shekhar");
lst.ToString<string>().Dump();
}
public static class ListHelper
{
public static string ToString<T>(this IList<String> list)
{
return string.Join(", ", list.ToArray());
}
public static string ToString<T>(this String[] array)
{
return string.Join(", ", array);
}
}
И результат был shekhar, shekhar, shekhar, shekhar
Поскольку вы указали, что T
в ToString<T>
, вам нужно указать тип типа string
или int
при вызове метода ToString.