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]里得到的。
sb.Append(pis[h].GetValue(type[i],null));
那个.号是我写错了。
/// <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(">");
}
}
}
}
这个没问题。已经调试了可以得到值。
试试这样:
foreach(object item in apiObj)
{
sb.Append(pis[h].GetValue(item,null));
}
怎么会不可以
很郁闷的是返回的泛型不就是要多个for吗.为什么for出来的对象就不是该值的对象了呢?
Type[] type = new Type[1];
type[0] = a.GetType();请问这里你要使用GetValue的时候,第一个参数是传递a还是type[0]呢?看出这个a和这个type[0]的区别了吗?
这一句有问题啊,应该是GetValue(apiObj.null)才对啊。你改改试一下!!!
你需要先输出apiObj.GetType().Name,看下这个类型这个是什么类型。虽然你强调是Object,但是如果并非泛型对象的话,type将获得空值。你需要根据apiObj的类型,先确定如何获取里面元素,然后才能对内部的元素调用调用其属性的GetValue方法反射其值。
如果是返回的单个对象,不管什么类型把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]吗
为什么这样反射确是与目标对象不匹配呢
想不通
{
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]来访问得到。
我的代码是这样,因为方法返回的值都不同。
所以,我是把所有东西都存放到 IList<Object>里。
所以原本的方法返回的是Ilist<int>的时候.
最后我是等于List里还有个List.
不知道错误是不是在这里.