Подтвердить что ты не робот

Как создать метод расширения для 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>. Может быть, мне нужны специальные аннотации?

4b9b3361

Ответ 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.