c# - 如何从 C# 中存储为对象的 object[] 进行转换

标签 c# arrays object

我有一个List<object>存储在数据库中。 每个列表对象由 object[] 组成。由 int 值组成。

我可以保存、查看和检索数据。我可以在调试器中查看数据。但我无法转换回 int 或数组。

foreach (object item in list)
{
    if (item.GetType().IsArray)
    {
        var arr = item as int[];

        foreach (var i in arr)
            print(i);
    }
}

在 if 语句中,item 显示调试器中的数据,如下图所示,但为 false,但如何转换回 object[]?

enter image description here

我也尝试过:

var newItem = item as object[];

编辑:这就是我初始化对象的方式。我从一个对象开始,因为如果我在发送到数据库时尝试包装 int[] ,则会出现强制转换错误。

var listValues = new List<object>();
var newArray   = new object[10];

newArray[0] = (int)c.Tag;
newArray[1] = (int)c.FPos;
newArray[2] = (int)c.ToL;

listValues.Add(newArray);

最佳答案

转换(通常)与转换不同。大多数时候,当您在 C# 中进行转换时,您会假设这些内容已经是您所说的那样,并且您根本不会更改它们。像 int 这样的值类型有一个异常(exception)。当您将它们转换到object时,它们会被“装箱”和“拆箱” 。但是,该异常(exception)并不适用于转换 object[]进入int[]

int[]object[] 不同。 ,因此您不能将其强制转换为一个。相反,您必须生成一个由所有这些 object 组成的新数组(或 Collection、IEnumerable 或其他)。 s 拆箱为整数。一种方法是使用 Cast<>()来自 System.Linq 命名空间的扩展方法。

int[] arr = ((object[])item).Cast<int>().ToArray();

或者,作为一个更完整的示例:

List<object[]> list = new List<object[]> { new object[] { 1, 2 }, new object[] { 3, 4 } };
foreach (object[] item in list)
{
    if (item.GetType().IsArray)
    {
        var arr = item.Cast<int>();
        foreach (var i in arr)
        {
            Console.WriteLine(i);
        }
    }
}

更新

根据您更新的问题,您问题的真正解决方案很可能会远远超出原始问题的范围。我不知道您使用什么机制来存储它并从数据库中检索它,但是如果您使用的是 Entity Framework 之类的东西,您可能需要更改您的模型,以便其值是强类型的。事实上,从对象中获取属性并将它们作为数组放入数据库的方式是一种很大的代码味道:很可能您的数据模型应该被展平为具有命名属性的类型。

但是要回答问题中最简单、最基本的部分:在尝试转换对象之前,您必须将对象转换为它们实际的类型。如果您有List<object> ,然后使用它:

foreach (List<object> item in list)
{
    int[] arr = item.Cast<int>().ToArray();
    foreach (var i in arr)
    {
        Console.WriteLine(i);
    }
}

关于c# - 如何从 C# 中存储为对象的 object[] 进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52012181/

相关文章:

arrays - 为什么在数组扩展中使用 Stride 非法创建临时数组

arrays - 大规模数据集的核方法

php - 如何比较两个包含用户详细信息的数组作为数组并从一个数组中删除匹配的元素?

c# - ASP.NET MVC 中独立项目 IoC 中的 AutoMapper 相同配置文件类

c# - ListView ItemActivate 延迟

javascript - 动态地将 Javascript 对象存储在另一个对象中

c# - 如何在 button_click 事件中从 Revit API 引用文档和应用程序?

javascript - 获取 JSON 对象内的 typeof 元素

c# - 如何在 Windows 上使用 Xamarin Studio 开发 iOS 应用程序?

c# - FTP上传后更改文件权限