我从未使用过Reflection,但我认为这种情况在没有过于昂贵的过程中会有用。我有五个不同的List< .object>其中每个都有不同的属性,我有一个WebMethod,它只返回这些类型的List< .object>中的一个基于switch语句,并将结果列表传递给应该迭代值并写入的方法将它们传递给传递回WebMethod的StringBuilder。我不想写五种不同的方法来迭代每个对象并写出字符串。
通过SO查看导致此代码作为该方法的良好开端(下面),但是,我不了解在此之后获得我需要的最佳方法。我尝试使用PropertyInfo [],但在投射对象时抛出了错误。 IEnumerable并没有抛出错误,但我似乎无法访问这些值。
private StringBuilder generateString<T>(T obj) where T : class
{
//Trying to use PropertyInfo[] example
Type type = obj.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach(PropertyInfo p in properties)
sb.Append("{0},{1}", p.Name, p.GetValue(obj,null));
//Trying to use IEnumerable example
IEnumerable enumerable = (IEnumerable)obj;
foreach(var x in enumerable)
sb.Append(x);
}
当我尝试查看PropertyInfo []数组中的值时,它向我显示它有三个项目,最后一个是我的对象类型,但我似乎无法找到任何实际值。它抛出两个错误TargetParameterCountException和TargetInvocationException。
但是,当我查看x的IEnumerable数据时,它会向我显示我期望看到的内容,除非我认为可以访问各个部分的格式,例如:
x
{Base.DataType.MyObject}
Age: 24
Name: Helen Smith
Cost: 24.00
Date: 2/25/2012
尝试访问此数据的正确方法是什么?我该如何正确地做到这一点?
答案 0 :(得分:2)
您似乎正在传递IEnumerable
,而不是单个对象。如果您需要迭代对象并分别获取每个项目和属性的类型:
if(obj is IEnumerable)
{
foreach(var item in (IEnumerable)obj)
{
Type type = item.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach(PropertyInfo p in properties)
sb.Append("{0},{1}", p.Name, p.GetValue(item,null));
}
}
答案 1 :(得分:0)
如果所有对象都具有相同的类型,我相信你正在做的事情。你传递的是List<T>
,你可以得到这样的项目类型:
var listType = obj.GetType();
var itemType = listType.GetElementType();
如果您传入itemType
,那么MyObject
List<MyObject>
即可。从那里你应该能够像GetProperties
一样。
如果列表是异构的,那么您需要循环访问并获取每个项目的属性,如@ Selman22的答案。
答案 2 :(得分:0)
您到底访问数据的最佳方式究竟是什么意思?您只是尝试访问StringBuilder对象中的内容,还是只需要以某种形式输出信息?
我过去使用反射来获取名称和值的方式如下:
public StringBuilder generateString(List<object> objList)
{
StringBuilder sb = new StringBuilder();
int itemNumber = 0;
foreach(var obj in objList)
{
foreach (var prop in obj.GetType().GetProperties())
{
// i used the new line characters to increase readability for
// output to a console so just ignore them.
sb.Append("Item " + itemNumber);
sb.Append("\n");
sb.Append(prop.Name + ", " + prop.GetValue(obj, null));
sb.Append("\n");
}
}
return sb;
}
查看此字符串构建器对象的输出,我看到了:
第1项
Property1,value
Property2,值
Property3,value
第2项
Property1,value
Property2,值
Property3,价值 等...
我希望这有助于你。