【求助】C# DbDataReader 转 List 动态类 ,怎么弄?

月之点点 2018-05-18 04:39:05
下面是我的代码。我写的只支持 转List<T> 但是不支持转List<dynamic> 求助大神。
有没有转 List<dynamic> 的代码。多谢。

///<summary>
///SqlDataReader转换成List<t>
///</summary>
///<param name="reader">数据</param>
///<returns></returns>

internal List<T> SqlPar_List<T>(DbDataReader reader) where T : new()
{
List<T> list;
//Type type = typeof(T);
string tempName = string.Empty;
if (reader.HasRows)
{
list = new List<T>();
while (reader.Read())
{
T t = new T();
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (SqlPar_readerExists(reader, tempName))
{
if (!pi.CanWrite)
{
continue;
}
var value = reader[tempName];
if (value != DBNull.Value)
{
pi.SetValue(t, value, null);
}
}
}
list.Add(t);
}
reader.Close();
return list;
}
return null;
}



研究了好久都无法实现。好郁闷
...全文
1785 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 2 楼 shijianyu00 的回复:
dynamic 里面没有属性,怎么循环? 是不是应该先动态添加属性然后在循环?
所谓的“动态添加属性”,你十有八九是指的是对 ExpandoObject 类型的对象实体来“动态添加属性”,因为它实现了 IDictionary<string,object> 接口。 那么假设要这样设计的时候,靠谱地接口设计,就是把返回值声明为 List<ExpandoObject> 而不是 List<dynamic>。设计之输出一个方法实现时,应该是越具体越好。调用方法的使用者才去考虑多态使用问题、dynamic 动态代码问题。这是内外有别的。 如果搞反了,就本末倒置了。
  • 打赏
  • 举报
回复
这样一个方法返回 List<T> 是实际的代码。 而这样一个方法返回 List<dynamic> 实际上是空洞的,因为这个方法内部必须先把实体类型“落地”,必须有实际的类型然后才能使用 dynamic 语法糖。没有实际类型,不知道方法里实际类型具体到什么类型,那么这个方法也就写不出来。 所以这个方法就应该返回 List<T>,或者任何具体可实现内涵的方法。dynamic 方法应该用于最终的“使用端”代码,而不是“输出端”代码来使用 dynamic 定义。
  • 打赏
  • 举报
回复
dynamic 只是一个语法糖,你没有说明要在方法里边具体用什么类型来实际承载对象,那么 dynamic 其实就是空洞的。 反过来说,假设你封装一个方法返回 List<dynamic>,那么其实掩盖了真实的类型,得不偿失。要使用 dynamic 语法你可以写
List<ABC> lst = ...............
foreach(var x in lst)
{
    dynamic y = x;
    var z = y.value;
}
这样,或者随时可以写
List<ABC> lst = ...............
var lst1 = lst.Cast<dynamic>();
foreach (var y in lst1)
{
    var z = y.value;
}
这样。代码 lst.Cast<dynamic>() 既可以随便得到 List<dynamic>,跟 DbDataReader 根本没有关系。 关键是,写代码必须尽可能地具体,而不是尽可能地空洞。真正懂得抽象的人,反而代码非常具体,最好的抽象的艺术性就在于月抽象则越简洁而具体,不把精力放在不必要的走弯路的抽象方式上。
月之点点 2018-05-18
  • 打赏
  • 举报
回复
引用 1 楼 zhanglong_longlong 的回复:

internal List<T> SqlPar_List<T>(DbDataReader reader) where T : new()
        {
            List<T> list=new List<T>();
            Type type = typeof(T);
            if (reader.HasRows)
            {
                
                while (reader.Read())
                {
                    object note = Activator.CreateInstance(type);
                    foreach (var item in type.GetProperties())
                    {
                        item.SetValue(note, reader[item.Name]);
                    }

                    list.Add(note as T);
                }
                reader.Close();
                return list;
            }
            return list;
        }
foreach (var item in type.GetProperties()) dynamic 里面没有属性,怎么循环? 是不是应该先动态添加属性然后在循环?
【Help】 2018-05-18
  • 打赏
  • 举报
回复

internal List<T> SqlPar_List<T>(DbDataReader reader) where T : new()
        {
            List<T> list=new List<T>();
            Type type = typeof(T);
            if (reader.HasRows)
            {
                
                while (reader.Read())
                {
                    object note = Activator.CreateInstance(type);
                    foreach (var item in type.GetProperties())
                    {
                        item.SetValue(note, reader[item.Name]);
                    }

                    list.Add(note as T);
                }
                reader.Close();
                return list;
            }
            return list;
        }

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧