使用反射调用某个类的方法_通过反射获取类的方法「建议收藏」

使用反射调用某个类的方法_通过反射获取类的方法「建议收藏」使用PropertyInfo类反射获取类的类型首先构造一个泛型类publicclassClassName{}然后定义一个方法方法返回集合viewplaincopytoclipboardprint?publicclassClass1{publicIListGetData(SqlDataRead…_propertyinfo获取类型

使用反射调用某个类的方法_通过反射获取类的方法「建议收藏」

使用PropertyInfo类反射获取类 的类型

 

首先构造一个泛型类

public class ClassName<T>

{

}

然后定义一个方法 方法返回集合

view plaincopy to clipboardprint?
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语法的简洁

view plaincopy to clipboardprint?
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)

转载于:https://www.cnblogs.com/dzone/archive/2011/04/01/2002447.html

今天的文章使用反射调用某个类的方法_通过反射获取类的方法「建议收藏」分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/58810.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注