如何创建将 DataRowCollection 转换为 C# 中泛型类型的对象数组的方法?

发布于 2024-09-01 01:43:27 字数 571 浏览 7 评论 0原文

我正在尝试创建一个方法,该方法采用 DataTable 或 DataRowCollection 并将其转换为通用类型的数组。像这样的事情:

    public static T[] ConvertToArray<T>(DataTable dataTable)
    {
        List<T> result = new List<T>();

        foreach (DataRow dataRow in dataTable.Rows)
            result.Add((T)dataRow);

        return result.ToArray();
    }

问题是这一行

result.Add((T)dataRow);

给出了 Cannot conversion System.Data.DataRow to T 。

如果我在不使用泛型类型的情况下执行相同的操作,并确保对象的类具有定义的自定义转换运算符,则代码工作正常。

所以现在的问题是,我如何使用泛型来实现这一点?

I am trying to create a method that takes a DataTable or a DataRowCollection and converts it to an array of a generic type. Something like this:

    public static T[] ConvertToArray<T>(DataTable dataTable)
    {
        List<T> result = new List<T>();

        foreach (DataRow dataRow in dataTable.Rows)
            result.Add((T)dataRow);

        return result.ToArray();
    }

The problem is this line

result.Add((T)dataRow);

which gives Cannot convert System.Data.DataRow to T.

If I do the same thing without using a generic type, and make sure the class of the objects have a defined custom conversion operator, the code works fine.

So the question is now, how do I pull this of using generics?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

悲喜皆因你 2024-09-08 01:43:27

您可以使用一个对象来提供 DataRow 上到您的类型的转换:

public interface IDataRowConverter<T>
{
    T Convert(DataRow row);
}

为您的函数提供自定义转换器:

public static T[] ConvertToArray<T>(DataTable dataTable, IDataRowConverter<T> converter)
{
    List<T> result = new List<T>();

    foreach (DataRow dataRow in dataTable.Rows)
        result.Add(converter.Convert(dataRow));

    return result.ToArray();
}

然后,实现您所需类型的接口:

public class MyObjectDataRowConverter : IDataRowConverter<MyObject>
{
    public MyObject Convert(DataRow row)
    {
        MyObject myObject = new MyObject();

        // Initialize object using the row instance

        return myObject;
    }
}

然后您可以使用以下代码调用您的函数:

MyObject[] objectArray = 
    ConvertToArray<MyObject>(datatable, new MyObjectDataRowConverter());

You could use an object that provides the conversion on a DataRow to your type :

public interface IDataRowConverter<T>
{
    T Convert(DataRow row);
}

Provide your custom converter to your function :

public static T[] ConvertToArray<T>(DataTable dataTable, IDataRowConverter<T> converter)
{
    List<T> result = new List<T>();

    foreach (DataRow dataRow in dataTable.Rows)
        result.Add(converter.Convert(dataRow));

    return result.ToArray();
}

Then, implement the interface for your needed type :

public class MyObjectDataRowConverter : IDataRowConverter<MyObject>
{
    public MyObject Convert(DataRow row)
    {
        MyObject myObject = new MyObject();

        // Initialize object using the row instance

        return myObject;
    }
}

You can then call your function using this code :

MyObject[] objectArray = 
    ConvertToArray<MyObject>(datatable, new MyObjectDataRowConverter());
太阳男子 2024-09-08 01:43:27

我发现的几个选项:

result = dataTable.Select()

var result = new System.Data.DataRow[dataTable.Rows.Count];
dataTable.Rows.CopyTo(result, 0);

Couple options I found:

result = dataTable.Select()

or

var result = new System.Data.DataRow[dataTable.Rows.Count];
dataTable.Rows.CopyTo(result, 0);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文