我已经构建了一个通用方法,它以下列方式“解除对象”:
public class AClass
{
public int Id {get; set;}
public string Name {get;set;}
}
public class NestingClass
{
public string Address {get; set;}
List<AClass> Classes {get; set;}
}
输出如果keyvaluepair列表:NestingClass值:none,AddressNestingClass值, List1.Generic.Collections ClassesNestingClass none,IdAClassNestingClass value,NameAClassNestingClass value。
我设法得到所有的类型,但是使用值有点困难,因为在使用propertyInfo.GetValue()时我不能总是使用对象,例如对于AClass的propertyInfos对象(这是类型的形成类的列表)对象应该是AClass类型。使用“this”也行不通。我得到的对象与目标对象不匹配。 我需要的是某种“切片”通过作为泛型参数传递的对象的机制,并尝试以这种方式获取值。 代码类似于:
public List<KeyValuePair<string,string>> Process(object foo)
{
if (foo == null)
return new List<KeyValuePair<string,string>>();
var result = List<KeyValuePair<string,string>>();
var types = new Stack<Helper>();
types.Push(new Helper { Type = o.GetType(),Name = string.Empty, Value = string.Empty });
while (types.Count > 0)
{
Helper tHelper = types.Pop();
Type t = tHelper.Type;
result.Items.Add(new KeyValuePair { Key = tHelper.Name, Value = tHelper.Value });
if (t.IsValueType || t == typeof(string))
continue;
if (t.IsGenericType)
{
foreach (var arg in t.GetGenericArguments())
types.Push(new TypeHelper { Type = arg, Name = string.Empty });
continue;
}
foreach (var propertyInfo in t.GetProperties())
{
//here comes the issue
types.Push(new TypeHelper { Type = propertyInfo.PropertyType, Name = propertyInfo.Name + propertyInfo.DeclaringType.Name, Value= propertyInfo.GetValue(this,null).ToString() });
}
}
return result;
}
答案 0 :(得分:2)
您似乎正在尝试从通用属性的类型所代表的类型中获取属性值。这是不可能的,因为您必须有一个实例来获取值。没有与Type参数关联的实例,因此没有要获取的属性值。
也许如果你能为你想要达到的目标提供更多的背景,我们可以帮助你实现目标。