public Class A
{
public int? Id{get; set;}
public string Name{get;set;}
public B b{get;set;}
}
public Class B
{
public int? Id{get;set;}
public string Name{get;set;}
}
public Class C
{
public T AnyOne<T>(T obj,string tableName,string ConnSr)
{
string sql = "SELECT * FROM {0} {1} ";
SqlConnection Conn = null;
DataSet ds = null;
try
{
//反射一个对象
Type type = obj.GetType();
PropertyInfo[] ps = type.GetProperties();
StringBuilder sb = new StringBuilder();
//查看对象的属性
foreach (var p in ps)
{
//上面有个A类和B类,A类里面有个属性是B类,
//我的问题是,在反射A类的过程中如何去实例化B类,给B类赋值
//目前,如果用判断类型,那么我是可以实现的,但是问题是,我model层里面有很多个
//类,都是有关系的,因为都是数据库的映射类,主外关系有很多,所以,用判断
//类型的话,太多,太麻烦,我想请问各位大虾,有没有更好的解决办法?
//还有,我这个方法用的循环,我觉得很多,有没有更好的办法可以解决?
var value = p.GetValue(obj, null);
//判断属性是否为空
if (value != null)
{
sb.AppendFormat(" {0}='{1}' AND ", p.Name, value.ToString());
}
}
string v = sb.ToString();
sql = string.Format(sql, tabName, v.Length > 0 ? " WHERE " + v.Substring(0, v.Length - 4) : "");
//存放到一个DataSet里面
SqlDataAdapter adapter = new SqlDataAdapter(sql,ConnStr);
ds = new DataSet(tabName);
adapter.Fill(ds);
//读取数据,存放到T里面
if (ds.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
{
foreach (var p in ps)
{
if (ds.Tables[0].Columns[i].ColumnName.ToLower() == p.Name.ToLower())
{
//判断是否为空值
if (!(ds.Tables[0].Rows[0][i] is DBNull))
{
p.SetValue(obj, ds.Tables[0].Rows[0][i], null);
break;
}
}
}
}
}
}
}
总体来说没看明白。
因为"SELECT * FROM {0} {1} ";返回一张表而已。提醒一下这里,通常都不建议 “select * “的,应该是用到哪几个字段,才返回哪几个字段。
请将你要返回哪些字段分别对应类型A、类型B的哪些属性再说的详细一下。
看看NHibernate是怎么实现的,自己写这个好像挺麻烦,我也用反射实现获Model,新增修改等,但楼主问题。。。欺待中..