谁会用c#的反射?高分求解,HttpRequest(或NameValueCollection )到ValueObject值对象的映射
我们经常用一个值对象操作(实体类)而从Request里取出来,再设置进去,每次都要做,很麻烦,所以我就有了写一个工具方法来自动处理这个,但做到一定程度就不会写了,大家帮个忙,我最高只能给100分,一次全给了 ,谢谢拉
值对象是这样的
public class Shipper
{ int id;
string companyName;
string phone; // Constructor
public Shipper(int id, string companyName, string phone)
{
this.id = id;
this.companyName = companyName;
this.phone = phone;
} public string CompanyName
{
get
{
return companyName;
}
}
public int Id
{
get
{
return id;
}
}
public string Phone
{
get
{
return phone;
}
}
}
公共方法是这样的(不会写了):static void setVO(HttpRequest Request,Object vo)
{
NameValueCollection nvc = Request.Params;
//PropertyInfo[] pi = vo.GetType().GetProperties();
Type t = vo.GetType();
FieldInfo[] fi = t.GetFields();
for(int i =0; i < fi.Length; i++){
Object v = null;
//这里就不会写了,vo(值对象)里有可能是各种类型的object子类,怎么写呀
//if(fi[i].GetType().Equals()){
// nvc.Get(fi[i].Name);
//}
t.InvokeMember(fi[i].Name,BindingFlags.SetProperty,null,vo,new Object[]{v});
}
我们经常用一个值对象操作(实体类)而从Request里取出来,再设置进去,每次都要做,很麻烦,所以我就有了写一个工具方法来自动处理这个,但做到一定程度就不会写了,大家帮个忙,我最高只能给100分,一次全给了 ,谢谢拉
值对象是这样的
public class Shipper
{ int id;
string companyName;
string phone; // Constructor
public Shipper(int id, string companyName, string phone)
{
this.id = id;
this.companyName = companyName;
this.phone = phone;
} public string CompanyName
{
get
{
return companyName;
}
}
public int Id
{
get
{
return id;
}
}
public string Phone
{
get
{
return phone;
}
}
}
公共方法是这样的(不会写了):static void setVO(HttpRequest Request,Object vo)
{
NameValueCollection nvc = Request.Params;
//PropertyInfo[] pi = vo.GetType().GetProperties();
Type t = vo.GetType();
FieldInfo[] fi = t.GetFields();
for(int i =0; i < fi.Length; i++){
Object v = null;
//这里就不会写了,vo(值对象)里有可能是各种类型的object子类,怎么写呀
//if(fi[i].GetType().Equals()){
// nvc.Get(fi[i].Name);
//}
t.InvokeMember(fi[i].Name,BindingFlags.SetProperty,null,vo,new Object[]{v});
}
解决方案 »
- 怎么从listbox1中取选中的值给 texbox1?
- 求一个正则表达式
- 关于.NET上传
- Win Form ComboBox禁止下拉--急
- 怎样控制用户输入的数据不含换行符?
- 在添加WEB引用时,为什么会出现"这台计算机上的代理设置没有针对 Web 发现进行正确配置。"高手帮我!!
- 怎么根据返回的一个object类型变量里值的类型,定义一个这种类型的数组
- System.Management;
- 线程的问题,请帮忙看看
- 请问有没有制作ASP.NET安装程序的工具?
- 反射对象中的static方法
- 如何将数据库信息保存在当前运行的.exe文件中,下次登录时不再输入,别告诉我另外用单独的配置文件实现,谢谢了
相信LZ也是研究了N天,弄不出,请高手也给解答一下,我也想知道答案
我以前写的拼接SQL语句的代码就是这么写的。
Type t = vo.GetType();
FieldInfo[] fi = t.GetFields();
foreach (FieldInfo fii in fi)
{
fii.SetValue(vo,nvc.Get(fii.Name()));
}
而实际使用时,有各种类型,需要类型转换
都有哪些类型,知道的朋友粘个用过的代码片段上来吧,谢谢拉
DataTable dt = (DataTable)obj;
给你段代码,获取类里所有属性的
希望能对你有所帮助using System;
using System.Reflection;
using System.Windows.Forms;public class TestField
{
private int i=12;
protected string sabc = "a";
public DateTime dt = DateTime.Now;
public User objUser=new User("001","张三"); //执行这个
public static void Exec()
{
TestField tf = new TestField();
GetProperties(tf);
} public static void GetProperties(Object t)
{
foreach (FieldInfo fi in t.GetType().GetFields(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic))
{
object o = fi.GetValue(t);
if (fi.FieldType.IsClass && !(o is String))
{
GetProperties(o);
}
else
{
MessageBox.Show (String.Format("name:{0}==>value:{1}", fi.Name, o.ToString()));
}
}
}
public class User
{
public string UserId=string.Empty;
public string UserName=string.Empty;
public User(string _userId,string _userName)
{
UserId=_userId;
UserName=_userName;
}
} }
using System.Reflection;class TestAAA
{static Object convert(string className, string fieldName, string fieldValue)
{
Assembly assembly = Assembly.LoadFrom("文件名.dll");
Type t = assembly.GetType(className);
Object obj = System.Activator.CreateInstance(t);
FieldInfo fi = t.GetField(fieldName);
Object temp = System.Convert.ChangeType(fieldValue, fi.FieldType);
fi.SetValue(obj, temp);
return obj;
}static void Main()
{
Object o = convert("MyClass","a","12");
Console.WriteLine(o.GetType().Name);
Console.WriteLine(o.GetType().GetField("a").GetValue(o));
Console.WriteLine(o.GetType().GetField("a").GetValue(o).GetType().Name);}
}
假设另一个工程中的所有类都编译到一个dll文件中了,在这很多的类当中,有一个类叫StringUtil,名称空间在HSMP.CommonBasic.Common下
该类中有一个方法:
public double GetSum(double x,double y)
{
return x+y;
}
编译后dll文件的存放路径是:D:\Test\HSMP.CommonBasic.dll
现在的问题是,如何通过程序调用该dll文件中的GetSum方法
大概有以下几步:
using System.Reflection;
A.
//这里要用LoadFrom,只有在本工程里添加了该dll的引用后才可以使用Load
Assembly objAss = Assembly.LoadFrom(@"D:\Test\HSMP.CommonBasic.dll");
//HSMP.CommonBasic.Common.StringUtil类的全路径
Type t=objAss.GetType("HSMP.CommonBasic.Common.StringUtil");
//动态生成类StringUtil的实例
object obj=System.Activator.CreateInstance(t);
//参数信息,GetSum需要两个int参数,如果方法没有参数,就声明一个长度为0的数组
System.Type[] paramTypes = new System.Type[2];
paramTypes[0] = System.Type.GetType("System.Int32");
paramTypes[1] = System.Type.GetType("System.Int32");
//找到对应的方法
MethodInfo p = t.GetMethod("SayHello", paramTypes)
//参数值,如果所调用的方法没有参数,不用写这些
Object[] parameters = new Object[2];
parameters[0] = 3;
parameters[1] = 4;
object objRetval = p.Invoke(obj, parameters); //如果没有参数,写null即可。