如何解决我如何 String.Join 盒装数组?
给定一个可能包含数组的 object
(例如 int[]
),我该如何调用正确的 IEnumerable<T>
String.Join
重载?
var a = new []{1,2,3};
object o = a;
String.Join(",",a); // "1,3"
String.Join(",o); // "System.Int32[]"
我希望 String.Join
上的 o
是数组的内容,而不是类型名称。
完整的上下文和下面的尝试
我有一个 object
可以包含任何东西,包括各种 IEnumerable<T>
和数组,例如Int32[]
。我有一种方法可以根据类型将其转换为适当的字符串:
private string ResultToString(object result)
{
return result switch
{
string res => res,IEnumerable<object> enumerable => String.Join(",enumerable),null => "*null*",_ => result.ToString()
};
}
目前,如果 result
是 int[]
,它会落入默认情况。
- 我无法将对象强制转换为
IEnumerable<object>
或object[]
,因为它是一个值数组 - 我可以将对象强制转换为
IEnumerable<int>
,但我事先不知道它是int
。我想避免必须为每个值类型列出一个案例(并且不包括结构?) - 我可以将对象强制转换为
IEnumerable
但这只是调用了object
的String.Join
重载,导致输出为System.Int32[]
-- 不幸的是没有 {{ 1}} 重载,仅IEnumerable
解决方法
您可以强制转换为 IEnumerable
,然后使用 Cast<T>
,它总是与 Object
一起成功:
private string ResultToString(object result)
{
IEnumerable enumerable = result as IEnumerable;
if(enumerable == null) return result?.ToString();
return string.Join(",",enumerable.Cast<object>());
}
这会调用 this String.Join
重载。备注:
Join<T>(String,IEnumerable<T>)
是一种方便的方法,可让您
连接 IEnumerable 集合的每个成员,而无需先
将它们转换为字符串。每个对象的字符串表示
在 IEnumerable 集合中是通过调用该对象的
ToString 方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。