C#propertyinfo getvalue

时间:2012-02-11 19:20:44

标签: c#

我已经构建了一个通用方法,它以下列方式“解除对象”:

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;
        }

1 个答案:

答案 0 :(得分:2)

您似乎正在尝试从通用属性的类型所代表的类型中获取属性值。这是不可能的,因为您必须有一个实例来获取值。没有与Type参数关联的实例,因此没有要获取的属性值。

也许如果你能为你想要达到的目标提供更多的背景,我们可以帮助你实现目标。