【问题标题】:How to create an extension method for ToString?如何为 ToString 创建扩展方法?
【发布时间】:2011-06-26 07:57:31
【问题描述】:

我试过这个:

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&lt;string&gt; 都不起作用。也许我需要一些特殊的注释?

【问题讨论】:

    标签: c# .net tostring


    【解决方案1】:

    仅当没有匹配的适用候选方法时才检查扩展方法。在调用ToString() 的情况下,总是有一个适用的候选方法,即object 上的ToString()。扩展方法的目的是扩展类型上可用的方法集,而不是覆盖现有方法;这就是为什么它们被称为“扩展方法”。如果要覆盖现有方法,则必须创建一个覆盖方法。

    【讨论】:

    【解决方案2】:

    只是你不应该使用名称ToString作为扩展方法,因为它永远不会被调用,因为该方法已经存在并且你不应该t 使用 T 因为它在那里没用。

    例如,我尝试了这个,它又返回了同样的东西:

    Console.WriteLine(lst.ToString<int>());
    

    输出:

    shekhar, shekhar, shekhar, shekhar
    

    所以这次我使用了int,它仍然运行,因为除了更改方法原型之外,T 没有任何用处。

    那么简单为什么你使用ToString Literal 作为方法名称,因为它已经存在并且你不能在扩展方法中覆盖它,这就是你必须使用@的原因987654327@ 使其通用。使用一些不同的名称,例如

    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

    由于您在 ToString&lt;T&gt; 中指定了 T,因此在调用 ToString 方法时需要提及 stringint 之类的类型。

    【讨论】:

    • 但是,当我调用 files.ToString() 时,它确实有效 :) 它比文件长,但我仍然喜欢它 :)
    • 正如我在开始时所说,我在 LINQPAD 中运行此代码,我们有 Dump() 方法来查看对象内部的内容.. 在普通 C# 程序中只需调用 Console.WriteLine(lst.ToString&lt;string&gt;());
    • 你可以将任何东西作为 T 传递,它会起作用。您没有在方法中使用泛型类型。 files.ToString(), files.ToString(), var str = list.ToString>(), etc.
    【解决方案3】:

    听起来您想替换 files.ToString() 返回的内容。如果不编写自定义类将files 分配为(即从List 继承并覆盖ToString()),您将无法做到这一点。

    首先,摆脱泛型类型 (&lt;T&gt;),你没有使用它。接下来,您需要重命名扩展方法,因为调用 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());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多