我正在尝试将对象(此处声明为'obj':object is array,primitive)转换为字符串数组。
对象可以是任何uint [],int16 []等等。
我一直在尝试使用
string[] str = Array.ConvertAll<object, string>((object[])obj, Convert.ToString);
当我尝试将未知类型对象强制转换为object []时,会出现问题。 我一直在犯错误。
我做的一次尝试失败了,正在使用
object[] arr = (object[])obj;
或
IEnumerable<object> list = obj as IEnumerable<object>
object[] arr = (object[])list;
我在转换时看到了关于值类型和引用类型问题的帖子。
是否有一个简单的代码可以处理对象[]的转换,无论对象的类型如何,只要它是一个数组? 我试图避免手动处理每种可能的类型铸件。
提前致谢
答案 0 :(得分:71)
您可以使用每个数组实现IEnumerable
:
string[] arr = ((IEnumerable)obj).Cast<object>()
.Select(x => x.ToString())
.ToArray();
这会在将它们转换为字符串之前适当地填充原语。
转换失败的原因是虽然引用类型的数组是协变的,但 value 类型的数组不是:
object[] x = new string[10]; // Fine
object[] y = new int[10]; // Fails
仅仅IEnumerable
投射会有效。哎呀,如果你愿意,你可以施展到Array
。
答案 1 :(得分:11)
如果它总是某种类型的集合(数组,列表等等),那么请尝试回到普通的System.Collections.IEnumerable
并从那里开始
string[] str = ((System.Collections.IEnumerable)obj)
.Cast<object>()
.Select(x => x.ToString())
.ToArray();
这是一个更彻底的实现,也可以处理非集合
static string[] ToStringArray(object arg) {
var collection = arg as System.Collections.IEnumerable;
if (collection != null) {
return collection
.Cast<object>()
.Select(x => x.ToString())
.ToArray();
}
if (arg == null) {
return new string[] { };
}
return new string[] { arg.ToString() };
}
答案 2 :(得分:-1)
我的例子:
public class TestObject
{
public string Property1 { get; set; }
public string Property2 { get; set; }
public string Property3 { get; set; }
}
static void Main(string[] args)
{
List<TestObject> testObjectList = new List<TestObject>
{
new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" },
new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" },
new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }
};
List<string[]> convertedTestObjectList = testObjectList.Select(x => new string[] { x.Property1, x.Property2, x.Property3 }).ToList();
}