C# 反射动态给属性赋值

C# 反射动态给属性赋值,第1张

public static T PopulateEntityFromCollection<T>(T entity, IDataReader collection) where T : new()

{

//初始化 如果为null

if (entity == null)

{

entity = new T()

}

//得到类型

Type type = typeof(T)

//取得属性集合

PropertyInfo[] pi = type.GetProperties()

foreach (PropertyInfo item in pi)

{

//给属性赋值

if (collection[item.Name] != null)

{

item.SetValue(entity, Convert.ChangeType(collection[item.Name], item.PropertyType), null)

}

}

return entity

}

你可以仿造我以前这个方法写

    public class ReflectDemo

    {

        public static void Main(string[] args)

        {

            // 正常方式创建对象和给属性赋值

            C c = new C()

            c.N = "helloworld"

            // 正常方式赋值

            Console.WriteLine("正常方式赋值:")

            Console.WriteLine(c.N)

            // 全反射方式

            var type = typeof(C)

            object obj = Activator.CreateInstance(type)

            // 属性赋值            

            PropertyInfo pInfo = type.GetProperty("N")

            if (pInfo != null)

            {

                pInfo.SetValue(obj, "helloworld", null)

                // 测试是否已经属性赋值。

                Console.WriteLine("测试是否已经属性赋值:")

                Console.WriteLine(((C)obj).N) 

                // 用反射方式获取属性的值

                Console.WriteLine("用反射方式获取属性的值:")

                Console.WriteLine(pInfo.GetValue(obj, null)) 

            }

            Console.Read()

        }

    }

C类代码如下:

    public class C

    {

        private string n

        public string N

        {

            get { return n }

            set { n = value }

        }

    }

class

c

=

class.forname("student")

//通过字符串装载类,

必须是绝对路径,

即包括包名

object

o

=

c.newinstance()

//获取装载类的实例,

如果找不到就会抛出异常

class[]

cs=

{sting.class,int.class}

//定义一个类的数组,

一般这种都是用在method的参数列表

//string.class说明传的是类型

method

m

=

c.getmethod("study",cs)

//获取装载类的实例的study方法,

注意后面的参数,

class[]

ca

=

{"tom",18}

//和上面有点不同,

这里传的是值

object

result

=

m.invoke(o,ca)

//执行method方法,并获取结果

反射一般都用在类名,字段,方法可以随便变化的时候,

还可以进行统一的处理,提高扩展性

比如说hibernate框架的实体类,

预先你不可能知道实体类会有什么字段,

包括字段的类型都是有可能随意变化的,

这时候要获取指定类的字段信息就必须得使用反射了.

还有struts的actionform等都一样

以上纯属个人意见,

学得不是很深,希望能给你带来帮助


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11958019.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存