问题描述
需要写一个通用方法,传一个实体类进去可以将需要的数据插入另一个结构一样字段名不同的表中的方法.可以是见解,方法,示例.目前碰到的问题是,如何传一个事先无法确认的实力类,然后进行判断组装.
解决方案
解决方案二:
什么叫做“结构一样字段名不同的表”?字段名不同怎么就叫做“结构一样”呢?不懂。
解决方案三:
另外,“传一个实体类进去”这个也混乱。程序流程是面向对象的,不是面向对象类的。
解决方案四:
A表id(int)name(nvarchar50)age(int)1张三202李四233王五22B表num(int)nickname(nvarchar50)nianling(int)现在我要写一个通用的方法.它要实现的功能是.我给它一个A表实体.它根据id号将idnameage1张三20插入B表.
解决方案五:
因为有多组表需要这样做,所以需要一个通用的方法去实现这些功能
解决方案六:
要么顺序匹配,要么字符包含匹配
解决方案七:
顺序是匹配的
解决方案八:
publicTSetValueByS<S,T>(Ssource)where:Tnew(){Tt=newT();PropertyInfo[]spiArr=typeof(S).GetProperties(),tpiArr=typeof(T).GetProperties();for(inti=0;i<spiArr.Length;i++){tpiArr.SetValue(spiArr.GetValue(source),t);}returnt;}
大概意思,没测试
解决方案九:
这跟你怎样“插”有关系,不可能什么都凭空制造,总要交代一下脚踩实地在哪里,哪怕你是踩在烽火轮上。比如说你使用Ado.NET,所谓常见的SqlHelper中的代码,那么大致可以这样写voidRunSqlServerCommand(stringsql,objectobj,Action<SqlParameterCollection,object>setter){using(varconn=GetMyDbConnection()){varcmd=conn.CreateCommand();cmd.CommandText=sql;cmd.CommandType=System.Data.CommandType.Text;if(setter!=null)setter(cmd.Parameters,obj);cmd.ExecuteNonQuery();}}
或者如果是一对象封装的方式,也可以使用事件方式来实现这里的setter。总之是把将来才需要扩展实现的流程作为回调方法。例如我们可以把setter作为一个static变量复用(省得在城里里到处重复写),然后可以这样在创建了一个新的object之后使用数据库classMyType{publicstringFieldA;publicDateTimeFieldB;publicintFieldC;}publicstaticAction<SqlParameterCollection,object>DeleteMyTypeObject=(ps,obj)=>{ps.Add("@P",System.Data.SqlDbType.Int).Value=((MyType)obj).FieldC;};voidtest(){MyTypex=newMyType{FieldC=1234};RunSqlServerCommand("deletefromabcwheremc>@P",x,DeleteMyTypeObject);}
设计要扩展,但无需反射。不过其实ado.net非常简单,我才懒得写SqlHelper呢。
解决方案十:
其实对于“通用方法”,如果你凭空想要一个通用方法,就会痴迷于不切实际、性能低下上百倍的所谓技术。然而如果你基于实际测试,会发现很多凭空出来的“通用方法”是不对的。