我有一些像
这样的功能private static UserInfo FillUserInfoFromDataRow(DataRow dr)
{
UserInfo user = new UserInfo();
user.UserID = (int) dr["UserID"];
user.UserName = (int) dr["UserName"];
user.ProjectID = (int) dr["ProjectID"];
user.ClassID = (int) dr["ClassID"];
..............
return user;
}
我想写一些通用函数 private static T FillEntityInfoFromDataRow(DataRow dr),它将处理类似的类型ProjectInfo,JobInfo等。
我可以获取DataRow参数的所有列名称,但我不知道如何获取通用T类型的所有相应字段以及如何进行适当的转换。 这是完成这项工作的方法吗? 谢谢!
伊兰。
答案 0 :(得分:10)
最好利用反射,谷歌没有这样的例子可以做到这一点。
检查以下示例
namespace MyNamespace.Data
{
class Converter
{
public static void Fill(object LogicObject, DataRow Row)
{
Dictionary<string, PropertyInfo> props = new Dictionary<string,PropertyInfo>();
foreach (PropertyInfo p in LogicObject.GetType().GetProperties())
props.Add(p.Name, p);
foreach (DataColumn col in Row.Table.Columns)
{
string name = col.ColumnName;
if (Row[name] != DBNull.Value && props.ContainsKey(name))
{
object item = Row[name];
PropertyInfo p = props[name];
if (p.PropertyType != col.DataType)
item = Convert.ChangeType(item, p.PropertyType);
p.SetValue(LogicObject, item, null);
}
}
}
}
}
查看完整的博文:http://kasey-jo.blogspot.com/2009/04/using-reflection-to-fill-business-layer.html
答案 1 :(得分:1)
我使用它,这有点像你需要的:
感谢Heinzi
public virtual void LoadDataRow(DataRow drow, params string[] parameters)
{
this.LoadDataRow(drow);
foreach (string property in parameters)
{
try
{
if (drow[property] != null)
{
PropertyInfo pi = this.GetType().GetProperty(property);
if (pi != null && drow.Table.Columns.Contains(property))
{
pi.SetValue(this, drow[property], null);
}
}
}
catch { throw; }
}
}
在您的情况下,您可能希望首先遍历对象的eproperty集合,并尝试从数据集加载,但是上面的代码应该可以帮助您开始。
修改
在MSDN上找到了这个:
System.Reflection.PropertyInfo[] p = MyObject.GetType.GetProperties();
foreach(System.Reflection.PropertyInfo prop in p)
{
....
}
答案 2 :(得分:0)
通过在基类中声明抽象方法,将此功能委派给每个特定的类本身。
顺便说一句,我建议将此方法命名为CreateFromDataRow()
abstract class InfoBase
{
public abstract InfoBase CreateFromDataRow(DataRow dr);
}
OR
abstract class InfoBase<T>
{
public abstract T CreateFromDataRow(DataRow dr);
}