Type[] type = apiObj.GetType().GetGenericArguments();
                                    for (int i = 0; i < type.Length; i++)
                                    {
                                        System.Reflection.PropertyInfo[] pis = type[i].GetProperties();                                        for (int h = 0; h < pis.Length; h++)
                                        {
                                            sb.Append("<");
                                            sb.Append(pis[h].Name);
                                            sb.Append(">");
                                             sb.Append(pis[h].GetValue(apiObj.null));  
                                            sb.Append("</");
                                            sb.Append(pis[h].Name);
                                            sb.Append(">");
                                        }
                                    }上面红色那行 报 对象与目标类型不匹配。
我换type[i]也是一样,我想不通type[i]怎么会不行。
pis就是type[i]里得到的。

解决方案 »

  1.   

    GetValue(apiObj.null)是你造出来的吧,应该是GetValue(apiObj,null)才对
      

  2.   

    日,你双重循环嵌套,那错误行传递的对象应该是才行:
    sb.Append(pis[h].GetValue(type[i],null));
      

  3.   

    这样写是错误的。我试 了,但就是想不明白pis明明就是type[i]里出来的,确也是错误
    那个.号是我写错了。
      

  4.   

    我得得到的是Ilist<object>不双重前套怎么行
      

  5.   

    了解过GetValue的高手帮忙看看
      

  6.   

    放出你的 apiObj 类的大体代码來.
      

  7.   


    /// <summary>
        /// 跟你据API列表获取返回值
        /// </summary>
        /// <returns></returns>
        protected IList<object> getApiData(string apiname,object[] obj)
        {
            IAPI iapi = ApiFactory.GetType(apiname);
            string[] strs = apiname.Split('.');
            string must = String.Empty;
            string notmust = String.Empty;
            IList<object> list = ApiFactory.FunctionCalc(strs[1], strs[2], obj);
            return list;
        }
    //得到传入的API列表返回的值
                                IList<object> list = getApiData(api, obj);
    foreach (object apiObj in list)
                                {
                                    if (apiObj.GetType().Name == "List`1")
                                    {
                                        Type[] type = apiObj.GetType().GetGenericArguments();
                                        for (int i = 0; i < type.Length; i++)
                                        {
                                            System.Reflection.PropertyInfo[] pis = type[i].GetProperties();
                                            for (int h = 0; h < pis.Length; h++)
                                            {
                                                sb.Append("<");
                                                sb.Append(pis[h].Name);
                                                sb.Append(">");
                                                sb.Append(pis[h].GetValue(apiObj, null));
                                                sb.Append("</");
                                                sb.Append(pis[h].Name);
                                                sb.Append(">");
                                            }
                                            
                                        }
                                    }
                                    
                                }
      

  8.   

    getApiData()这个方法是根据我传入的参数调用方法得到返回值
    这个没问题。已经调试了可以得到值。
      

  9.   

    Ilist不是这样获取的GetValue是必须针对具体的对象来获取,但是你传递apiObj的话,获取的属性不属于该对象,传递type[i]的话,那个是Type对象,不是Ilist包含的对象元素,因此属性也不属于type[i]。
    试试这样:
    foreach(object item in apiObj)
    {
    sb.Append(pis[h].GetValue(item,null));
    }
      

  10.   

    apiObj是Object类型,foreach不起作用 的
      

  11.   

    问题是pis(h)我是从type[i].GetProperty()中获取的。
    怎么会不可以
      

  12.   

    GetValue是要你要获取的值的所属的类。我调其他返回单个对象的没问题。
    很郁闷的是返回的泛型不就是要多个for吗.为什么for出来的对象就不是该值的对象了呢?
      

  13.   

    string a = "1";
    Type[] type = new Type[1];
    type[0] = a.GetType();请问这里你要使用GetValue的时候,第一个参数是传递a还是type[0]呢?看出这个a和这个type[0]的区别了吗?
      

  14.   

     sb.Append(pis[h].GetValue(apiObj.null));  
    这一句有问题啊,应该是GetValue(apiObj.null)才对啊。你改改试一下!!!
      

  15.   

    晕,看来你还没理解啊。
    你需要先输出apiObj.GetType().Name,看下这个类型这个是什么类型。虽然你强调是Object,但是如果并非泛型对象的话,type将获得空值。你需要根据apiObj的类型,先确定如何获取里面元素,然后才能对内部的元素调用调用其属性的GetValue方法反射其值。
      

  16.   

    我知道你说的意思。
    如果是返回的单个对象,不管什么类型把apiObj放进GetValue(apiObj.null)是都能通过反射得到值的。
    不明白点的就是得到个Ilist我要通过遍历才可以获取到里面的对象。 
    Type[] type = apiObj.GetType().GetGenericArguments();
    这句也已经获取到对象了。
    然后我在循环type得到每个里面的公共属性.这也能获取到了。
    for(int i=0;i<type.length;i++)
    然后通过type[i].GetProperty()也获取到属性了。这样下来pis[h]所属的对象不正是type[i]吗
    为什么这样反射确是与目标对象不匹配呢
    想不通
      

  17.   

    因为刚接触这个System.Reflection下面的类。也不知道理解的对不对
      

  18.   

    没仔细看你贴的代码。关于你的疑问,我其实在#13楼已经举例给你看了,除非你强制类型转换后遍历获取其中的元素,因为pis[h]所属的对象不是type[i],那个type[i]就等同于我13楼举例的type[0],我问你是传递a还是type[0],你回答“肯定传a 啊。”,这里也是同理,不能传type[i]。至于什么对象的属性是type[i]呢?这就没获取到它。apiObj.GetType().GetGenericArguments()方法直接返回了这个apiObj对象使用的泛型T的类型,就算apiObj内部不存在任何泛型T的对象,这个方法仍旧可以返回T的类型,如果不存在任何T的对象,你自然无法获取T类型的值了,那么有多少个对象就获取多少个值。public class C1
    {
     public string a{get;set;}
     public string b{get;set;}
    }
    假设你的apiObj对应的类型是List<C1>,那么"type=apiObj.GetType().GetGenericArguments()"得到的type数组内部只有一个元素,那个元素就是typeof(C1),也就是说,type[0] == typeof(C1),这时pis含有两个属性元素,一个是a,一个是b,分别调用其GetValue方法时,第一个参数显然是传递C1对象,而不是typeof(C1),那个C1对象只能通过list[i]来访问得到。
      

  19.   

    这几天顾着玩,没有上来看。
    我的代码是这样,因为方法返回的值都不同。
    所以,我是把所有东西都存放到 IList<Object>里。
    所以原本的方法返回的是Ilist<int>的时候.
    最后我是等于List里还有个List.
    不知道错误是不是在这里.
      

  20.   

    这个编辑框好垃圾该换了,csdn落伍了
      

  21.   

    如何使用PropertyInfo.GetValue()和PropertyInfo.SetValue(),其中的参数分别对应什麽意思呢~?