![](/img/trans.png)
[英]Dictionary<string, MyClass> to List<KeyValuePair<string, string>> where the Value in KeyValuePair is MyClass.ToString()
[英]Overriding ToString() of List<MyClass>
我有一个类MyClass,我想覆盖List实例的方法ToString():
class MyClass
{
public string Property1 { get; set; }
public int Property2 { get; set; }
/* ... */
public override string ToString()
{
return Property1.ToString() + "-" + Property2.ToString();
}
}
我想要以下内容:
var list = new List<MyClass>
{
new MyClass { Property1 = "A", Property2 = 1 },
new MyClass { Property1 = "Z", Property2 = 2 },
};
Console.WriteLine(list.ToString()); /* prints: A-1,Z-2 */
有可能这样做吗? 或者我必须继承List <MyClass>来覆盖我的子类中的方法ToString()? 我可以使用扩展方法解决这个问题(即,是否可以使用扩展方法覆盖方法)?
谢谢!
也许有点偏离主题,但我使用ToDelimitedString
扩展方法,适用于任何IEnumerable<T>
。 您可以(可选)指定要使用的分隔符,并使用委托为每个元素执行自定义字符串转换:
// if you've already overridden ToString in your MyClass object...
Console.WriteLine(list.ToDelimitedString());
// if you don't have a custom ToString method in your MyClass object...
Console.WriteLine(list.ToDelimitedString(x => x.Property1 + "-" + x.Property2));
// ...
public static class MyExtensionMethods
{
public static string ToDelimitedString<T>(this IEnumerable<T> source)
{
return source.ToDelimitedString(x => x.ToString(),
CultureInfo.CurrentCulture.TextInfo.ListSeparator);
}
public static string ToDelimitedString<T>(
this IEnumerable<T> source, Func<T, string> converter)
{
return source.ToDelimitedString(converter,
CultureInfo.CurrentCulture.TextInfo.ListSeparator);
}
public static string ToDelimitedString<T>(
this IEnumerable<T> source, string separator)
{
return source.ToDelimitedString(x => x.ToString(), separator);
}
public static string ToDelimitedString<T>(this IEnumerable<T> source,
Func<T, string> converter, string separator)
{
return string.Join(separator, source.Select(converter).ToArray());
}
}
您需要子类来覆盖任何方法。 泛型的意思是说你想要相同的行为而不管T的类型。如果你想要特定类型的T的不同行为,那么你打破了这个合同并且需要编写你自己的类:
public class MyTypeList : List<MyClass>
{
public override string ToString()
{
return ...
}
}
编辑添加:
不,您不能通过创建扩展来覆盖方法,但是您可以使用特定于此列表类型的不同签名创建新方法:
public static string ExtendedToString(this List<MyClass> list)
{
return ....
}
用于
List<MyClass> myClassList = new List<MyClass>
string output = myClassList.ExtendedToString();
我仍然认为你的子类化更好...
实际上,您可以使用unicode技巧来直接针对通用列表定义备用ToString方法。
如果在visual studio中启用十六进制字符输入,则可以通过按住Alt键创建不可见字符,然后在数字键盘上按下以下键+ FFF 9(现在释放Alt)
所以我们可以创建以下函数,在其名称旁边放置一个不可见的字符...(是的,我知道它的VB代码,但是这个概念仍然适用于C#)
<Extension()> _
Public Function ToString(ByVal source As Generic.List(Of Char)) As String
Return String.Join(separator:="", values:=source.ToArray)
End Function
现在在visual studio中,当您根据列表访问intellisense时,您可以在标准ToString或自定义函数之间进行选择。
要在Visual Studio中启用十六进制字符输入,您可能需要编辑注册表
打开HKEY_CURRENT_USER \\ Control Panel \\ Input Method并创建一个名为EnableHexNumpad的REG_SZ,将其设置为1
您还需要禁用文件,编辑,调试,数据菜单的快捷方式,在Visual Studio中,打开工具菜单,选择自定义,然后打开命令选项卡,并使用任何菜单项的修改选择按钮其中任何一个ABCDEF特征为捷径,删除&
否则,您将最终打开弹出菜单,而不是键入十六进制字符。
如果您的方法必须命名为ToString
,则必须从List
派生一个类。 你可以把它变成通用的:
static class MyList<T> : List<T>
{
public override string ToString()
{
// ...
}
}
在这种情况下,如果您希望进行自定义转换,则必须在整个应用程序中使用MyList
而不是List
。
但是,如果您可以为方法选择其他名称,则可以使用扩展方法并获得相同的效果,几乎不需要修改代码:
您可以使用扩展方法使其更通用:
static class ListExtension
{
public static void ConvertToString<T>(this IEnumerable<T> items)
{
// ...
}
}
你可以在IEnumerable<T>
任何实例上使用它,就好像它是一个普通的方法:
List<MyClass> list = new List<MyClass> { ... };
Console.WriteLine(list.ConvertToString());
int[] array_of_ints = {1,2,3,4,5};
Console.WriteLine(array_of_ints.ConvertToString());
您必须创建自己的继承自Collection的自定义类,然后专门覆盖该类的ToString()方法。
不可能。 TList的ToString将为您提供列表对象的字符串表示形式。
你的选择是:
希望有所帮助!
根据您想要覆盖List<T>.ToString()
以返回特定内容的确切原因,可以方便地查看自定义TypeConverter
实现。
如果只想一个List<T>
特定的T
到本身表现出一定的方式作为一个string
中的位置,其中类型转换器的使用,像在调试器或在string.Format("List: {0}", listVariable)
型的情况下,这可能就足够了。
您可能只是看到ToString()的结果显示在某处并希望更改它,而不知道TypeConverter
的存在以及使用它们的位置。 我相信.NET Framework中的默认TypeConverters的许多/大部分/全部(不确定哪个?)在将定义它们的任何类型转换为string
时只使用ToString()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.