{
//初始化 如果为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 }
}
}
classc
=
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等都一样
以上纯属个人意见,
学得不是很深,希望能给你带来帮助
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)