Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#web表单中,如何使用泛型类型从数据集中加载列表?_C#_Sql Server_Generics_Orm - Fatal编程技术网

在C#web表单中,如何使用泛型类型从数据集中加载列表?

在C#web表单中,如何使用泛型类型从数据集中加载列表?,c#,sql-server,generics,orm,C#,Sql Server,Generics,Orm,我试图将数据集中的内容映射到列表中,但我希望能够将类型传递到函数中。我已经有了以下代码: public class WorkOrderAttachment : DatabaseObject { [TableData] //public List<int> attachment_id { get; set; } public int attachment_id { get; set; } [TableData] //public List<

我试图将数据集中的内容映射到列表中,但我希望能够将类型传递到函数中。我已经有了以下代码:

public class WorkOrderAttachment : DatabaseObject
{
    [TableData]
    //public List<int> attachment_id { get; set; }
    public int attachment_id { get; set; }
    [TableData]
    //public List<int> wo_id { get; set; }
    public int wo_id { get; set; }

    public WorkOrderAttachment()
    {

    }
。 .

公共静态列表LoadDataAll(T类型,数据集ds)
{
List fillList=新列表();
如果(ds.Tables[0].Rows.Count>0)
{
foreach(ds.Tables[0].行中的数据行dr)
{
foreach(type.GetType().GetProperties()中的var prop)
{
if(prop.GetCustomAttributes(typeof(TableData),false).Length>0&&ds.Tables[0].Columns.Contains(prop.Name.ToLower())
{
if(dr[prop.Name.ToLower()!=DBNull.Value)
{
prop.SetValue(type,Convert.ChangeType(dr[prop.Name.ToLower()],prop.PropertyType),null);
}
其他的
{
//如果我们使用的是字符串,且值为null,则默认为空字符串
if(prop.PropertyType==typeof(String))
{
if(dr[prop.Name.ToLower()]==DBNull.Value)
{
属性设置值(类型为“”,空);
}
}
}
}
}
添加(类型);
}
}
返回填充列表;
}
。 .

我是这样使用它的:

return DatabaseObject.LoadDataAll<WorkOrderAttachment>(new WorkOrderAttachment(), ds);
返回DatabaseObject.LoadDataAll(新的WorkOrderAttachment(),ds);
这是可行的,但假设数据集中的表中有两行。第一次循环时,它将进入fullList.Add(type)并按其应该的方式将数据放置到位。“附件id=1,工单id=1000”

但是,下一次循环时,它会设置“附件id=2,工单id=1000”。一切看起来都很好,但事实并非如此。当我检查填充列表时,我发现两个条目,但它们都是重复的最后一项“附件id=2,wo\U id=1000”。我想,第一个实例(我知道它已经就位)会被覆盖,因为它是通过引用处理的

(在这种情况下,我不想使用实体框架或其他ORM,但如果能使用其他选项将数据从数据集中提取到列表中,我将不胜感激。)

我希望能够指定如下内容(伪代码):

List Attachments=DatabaseResult();

但,我也希望它是通用的,这样我就可以将任何类型放入DatabaseResult,并将响应作为已经加载了数据的列表。如果您对如何解决此问题或实施更好的解决方案有任何建议,我们将不胜感激。

我在StackOverflow的另一个问题中找到了答案,尽管我的问题与此不同。答案是一样的:

使用where T:new()语法,我可以为每一行创建一个新类型,并将其传递到发送回的fillList中。我对这种方法的用法如下:

return DatabaseObject.LoadDataAll<WorkOrderAttachment>(ds);
返回DatabaseObject.LoadDataAll(ds);
返回的结果是一个WorkOrderAttachment列表,我只需传入数据集

return DatabaseObject.LoadDataAll<WorkOrderAttachment>(new WorkOrderAttachment(), ds);
List<WorkOrderAttachment> Attachments = DatabaseResult();
public static List<T> LoadDataAll<T>(DataSet ds) where T : new()
{
    foreach (DataRow dr in ds.Tables[0].Rows)
    {
        T type = new T();
        foreach (var prop in type.GetType().GetProperties())
        {
return DatabaseObject.LoadDataAll<WorkOrderAttachment>(ds);