首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

泛型的使用有关问题,数据层处理方面

2012-01-07 
泛型的使用问题,数据层处理方面类user包含userid和name属性。其他类类似然后期望用以下方法,实现对数据库数

泛型的使用问题,数据层处理方面
类user包含userid和name属性。其他类类似

然后期望用以下方法,实现对数据库数据的更新操作
public   void   SetModels <T> (SqlCommand   cmd,CommandType   ct,string[]   paramsname)
                {
                        List <T>   list   =   new   List <T> ();
                        T   obj;

                        obj   =   (T)Activator.CreateInstance(typeof(T));
                        foreach   (PropertyInfo   fi   in   typeof(T).GetProperties())
                        {
                                foreach   (string   s   in   paramsname)
                                {
                                        if   (fi.Name   ==   s)
                                        {
                                                cmd.Parameters.AddWithValue(fi.Name,   fi.GetValue(obj,   null));
                                        }
                                }
                        }

                        DB.ExecuteNonQuery(cmd);
                }

然后发现一个比较傻的问题,我不知道如何能把user类的实体(或者其他类的实体)的属性值给传进上边的方法里边。

如果增加参数,比如是增加一个object[]是应该能实现,但总觉得怪怪的?

以前一直是1.1。。。所以不太清楚怎么写比较好了。谢谢各位的帮忙


[解决办法]
这样吗?
user ur =new user();
SetModels <u> (...)
[解决办法]
这个你一定要增加一个参数把实体类传递进去!没有别的办法!
[解决办法]
来另一个问题,这样反射带来的性能消耗,有什么办法能够补救吗?
-----------------------------------
一般来说没有!
----------------------------------
另一方面可能是因为我用得不熟练吧,数据层的代码看起来写少了,但每次这样调用的话业务的代码好像又增多了 - - 怎么去平衡呢?
----------------------------
这个要看你的实际应用,不过我个人是不喜欢这样去做的!我一般把所有的SQL相关代码都写在数据层里面。而不是由业务层来生成SQLCommand或其它的数据相关操作!

[解决办法]
public static List <T> CreateLinkedReportList <T> (IList itemEntitys, Bas_Report currentPaintingReport) where T : ReportEntity, new()
{
List <T> bindingData = new List <T> ();
ReportEntity preEntity = null;

int index = 1;
foreach (ItemEntity var in itemEntitys)
{
T entity = null;
if (bindingData.Count == 0)


{
T firstItem = new T();
firstItem.itemEntity = null;
firstItem.report = currentPaintingReport;

bindingData.Add(firstItem);
}
entity = new T();
entity.itemEntity = var;
entity.report = currentPaintingReport;

bindingData.Add(entity);
entity.index = index++;
if (preEntity != null)
{
preEntity.NextItem = entity.Item;
}
preEntity = entity;
}
return bindingData;
}

这个是我写的一段,就是要把所有Entity串起来,希望对你有帮助
[解决办法]
CommandType ct 这个参数可以省略的。

基类里面判断一下是否合法的SQL语句,如果不就是就当存储过程处理。

这样才节约劳动量。
[解决办法]
代码也似乎并没有减少很多?怎么会?
在这里使用反射是绝对值得的,牺牲一点性能也问题不大。
即使非常注重性能,也应该是在开发的最后阶段考虑,用代码生成器生成代码。

热点排行