您的位置:首页 > 编程语言

[原创]让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型

2013-08-17 09:43 507 查看
以前在开发一个系统的时候

小组里的人在写方法的时候很累,很多方法都是对象的属性需要大量的重复赋值,然后 添加到List对象中

你是否还在为一个对象里有几十 上百个属性 手动写代码赋值烦恼呢?

下面是一个以前的读取数据库 信息的例子

[c-sharp]
view plaincopyprint?

public IList<KFS_Model.QAS_V_MessageInfo> PagerTest(string where, KFS_Model.Pager p)

{
SqlDataReader dr = null;

string table = "QAS_V_MessageInfo";

string orderby =
"QuestionTime";
IList<KFS_Model.QAS_V_MessageInfo> list =
new List<KFS_Model.QAS_V_MessageInfo>();
Pagination.page(table, where, orderby,
true,p);
dr = Pagination.page(table, where, orderby,
false, p);
while (dr.Read())

{
KFS_Model.QAS_V_MessageInfo qas =
new KFS_Model.QAS_V_MessageInfo();
qas.UserId = dr.GetGuid(1);
qas.UserName = dr.GetString(2);
qas.SonModelId = dr.GetGuid(3);
qas.SonModelName = dr.GetString(4);

qas.QuestionId = dr.GetGuid(5);
qas.QuestionTitle = dr.GetString(6);

qas.QuestionUrl = dr.GetString(7);
qas.QuestionTime = dr.GetDateTime(8);

qas.QuestionSession = dr.GetInt32(9);
qas.QuestionContent = dr.GetString(10);
qas.FatherModelId = dr.GetGuid(11);
list.Add(qas);
}
return list;

}

[c-sharp] 
view plaincopyprint?

public class Class1<T> 

{  
    public IList<T> GetData(SqlDataReader reader) 

    {  
        IList<T> list = new List<T>(); 

        Type type = typeof(T);  

        PropertyInfo[] properties = type.GetProperties();  

  
        while (reader.Read()) 

        {  
            T t = Activator.CreateInstance<T>();  
            for (int i = 0; i < properties.Length; i++) 

            {  
                properties[i].SetValue(t, reader[i + 1], 
null);  
  
            }  
  
            list.Add(t);  
        }  
  
        return list;  

    }  
}  

    public class Class1<T>
    {
        public IList<T> GetData(SqlDataReader reader)
        {
            IList<T> list = new List<T>();
            Type type = typeof(T);
            PropertyInfo[] properties = type.GetProperties();

            while (reader.Read())
            {
                T t = Activator.CreateInstance<T>();
                for (int i = 0; i < properties.Length; i++)
                {
                    properties[i].SetValue(t, reader[i + 1], null);

                }

                list.Add(t);
            }

            return list;
        }
    }


上面给出了核心代码 如果你要传递sql语句

那你的业务逻辑层 就要这一个方法也就够了!

下面一个扩展方法 由 论坛的sql1234提供 在一次感叹 linq语法的简洁

[c-sharp]
view plaincopyprint?

public static IEnumerable<T> GetObjects<T>(this DbDataReader rd) where T :
new()
{
var fs = (from fd in
typeof(T).GetFields()
let desc = new { field = fd, index = rd.GetOrdinal(fd.Name) }

where desc.index >= 0
select desc)
.ToList();
foreach (var x in rd)

{
var obj = new T();
fs.ForEach(d => { d.field.SetValue(obj, rd[d.index]); });

yield return obj;
}
}

public static IEnumerable<T> GetObjects<T>(this DbDataReader rd) where T : new()
{
var fs = (from fd in typeof(T).GetFields()
let desc = new { field = fd, index = rd.GetOrdinal(fd.Name) }
where desc.index >= 0
select desc)
.ToList();
foreach (var x in rd)
{
var obj = new T();
fs.ForEach(d => { d.field.SetValue(obj, rd[d.index]); });
yield return obj;
}
}

这里,我们通过扩展方法,为任意DbDataReader都增加了一个GetObjects方法,返回任意指定类型的强类型的对象集合。
如果包括private的field才更完整。应该将 GetFields() 修改为

GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐