将对象属性转换为数组

mike75

新成员
已加入
2021年1月30日
留言内容
3
编程经验
1-3
C#:
public class myObj
{
    public string ob1 { get; set; }
    public string ob2 { get; set; }
}

List<myObj> objlist = new List<myObj>();

objlist.Add(new myObj
{
    ob1 = "A",
    ob2 = "1"
});
objlist.Add(new myObj
{
    ob1 = "B",
    ob2 = "2"
});

List<string[]> converted = MyConvert(objlist);


public static List<string[]> MyConvert(List<objlist> mobj)
{
    foreach (objlist item in mobj)
    {
        string[] arr = ((IEnumerable)item).Cast<objlist>()
                         .Select(x => x.ToString())
                         .ToArray();
    }
}

我一直在尝试转换对象 objlist 到字符串数组列表。我搜索了网络,发现IEnumerable可能会有所帮助,但是运行程序时我被错误阻止了...

System.InvalidCastException
HResult = 0x80004002
Message =无法将类型“ objlist”的对象转换为类型“ System.Collections.IEnumerable”。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
为什么要在对象中将完美的数据存储到字符串列表中?

无论如何,您就在那里。您想要类似的东西:
C#:
return objList.Select(o => new string[] { o.ob1, o.ob2 })
              .ToList();

The Select() returns an array of strings for each of the objects in the objList. The ToList() converts the IEnumerable<string[]> into a List<string[]>.
 

mike75

新成员
已加入
2021年1月30日
留言内容
3
编程经验
1-3
为什么要在对象中将完美的数据存储到字符串列表中?

无论如何,您就在那里。您想要类似的东西:
C#:
return objList.Select(o => new string[] { o.ob1, o.ob2 })
              .ToList();

The Select() returns an array of strings for each of the objects in the objList. The ToList() converts the IEnumerable<string[]> into a List<string[]>.

谢谢 @跳伞!有没有一种方法可以自动枚举属性名称?
该对象中可能有50多个属性,并且逐个命名该属性需要花费大量时间和精力。 ðŸ〜 ...
 

mike75

新成员
已加入
2021年1月30日
留言内容
3
编程经验
1-3
为什么要在对象中将完美的数据存储到字符串列表中?

无论如何,您就在那里。您想要类似的东西:
C#:
return objList.Select(o => new string[] { o.ob1, o.ob2 })
              .ToList();

The Select() returns an array of strings for each of the objects in the objList. The ToList() converts the IEnumerable<string[]> into a List<string[]>.

返回二维数组字符串[,]怎么样?第一个维度是线条,第二个维度是列。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
Thanks @跳伞!有没有一种方法可以自动枚举属性名称?
该对象中可能有50多个属性,并且逐个命名该属性需要花费大量时间和精力。 ðŸ〜 ...
通常,您可以使用反射。反射速度很慢,通常在不需要反射的情况下应避免反射。如果您希望能够在不引用属性的情况下访问属性值,则可以采用以下方法:
C#:
var items = new List<Thing>();

// Populate list here.

List<string[]> propertiesOfItems = items.Select(st => st.GetType()
                                                        .GetProperties(BindingFlags.Instance | BindingFlags.Public)
                                                        .Select(pi => pi.GetValue(st)?.ToString())
                                                        .ToArray())
                                        .ToList();
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
返回二维数组字符串[,]怎么样?第一个维度是线条,第二个维度是列。
而为什么要这么做呢?您为什么要隐藏此请求的原因?如果只是为了学习,那很好,但是就这么说。如果有真正的原因,请告诉我们,因为我怀疑这个原因被误导了,您最好做点其他的事情。我们想通过提供最佳解决方案来提供帮助,但是如果我们甚至不知道您实际上要解决什么问题,我们就无法做到。 2D阵列占有一席之地,但是很少很好地使用它们,而且这种用途看起来确实不那么多,因此可以保证您在问我们如何做错事。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
With regards to post #6, the code can look daunting to the uninitiated but it's not especially complex. The outer Select gets a string array of property values for each list item and then creates a generic List of those arrays. The inner Select gets a string array of property values for one item using Reflection. It gets a Type 目的 for the item's type, gets an array of PropertyInfo objects for the public, instance properties of that type, gets the value of each of those properties and converts them to string objects and then puts the results in an array. I haven't tested that code but I believe that that is the correct combination of BindingFlags values, assuming that you really do want just public, instance properties.
 
最佳 底部