谁会用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});

解决方案 »

  1.   

    关注,我作的话,先搜一大堆的资料,再研究几天,实在作不了,然后,再来问。
    相信LZ也是研究了N天,弄不出,请高手也给解答一下,我也想知道答案
      

  2.   

    vo.GetType().ToString()就能得到当前的类型。返回的是字符串,你写几个case应该就可以了。
    我以前写的拼接SQL语句的代码就是这么写的。
      

  3.   

    和类型没什么关系吧,只要ValueObject栏位的名称和Request的栏位的名称一样,就赋上:
    Type t = vo.GetType();
    FieldInfo[] fi = t.GetFields();
    foreach (FieldInfo fii in fi) 
    {
    fii.SetValue(vo,nvc.Get(fii.Name()));
    }
      

  4.   

    我是楼主主要是我那边传来的都是String类型
    而实际使用时,有各种类型,需要类型转换
    都有哪些类型,知道的朋友粘个用过的代码片段上来吧,谢谢拉
      

  5.   

    object obj = System.Reflection.Assembly.Load("System.Data").CreateInstance("DataTable");
    DataTable dt = (DataTable)obj;
      

  6.   

    实在没弄明白楼主的意思
    给你段代码,获取类里所有属性的
    希望能对你有所帮助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;
    }
    } }
      

  7.   

    using System;
    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);}
    }
      

  8.   

    运用反射调用其它程序集中的方法:
    假设另一个工程中的所有类都编译到一个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即可。