试图获取通用列表属性值,但给了我一个例外

时间:2016-04-07 08:07:57

标签: c# list generics

我试图获取具有List<T>属性的自定义类的值,但是它会抛出异常(对象与目标类型不匹配。)。

我想首先检查值是Null,如果没有则处理该值。

型号:

public class CustomModel
{
    public List<Foo> FooList { get; set; }

    public List<Bar> BarList { get; set; }

}

处理模型数据的代码:

public class Result<T>
{
    private readonly T _model;

    public Result(T model)
    {
        _model = model;
    }

    private CustomObject CreateSomething(T model)
    {
        var obj = new CustomObject();

        var type = model.GetType();
        var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

        foreach (var property in properties)
        {
            if (property.PropertyType.IsGenericType && 
                typeof(List<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition()))
            {

                //this throws an error
                var testList = property.GetValue(this, new object[] { });

                //processed value will be passed to object

                //some codes here after getting the property value

            }
        }

        return obj;
    }
}

如何获取值以便我可以处理它们?

2 个答案:

答案 0 :(得分:1)

您应该使用List<>MakeGenericType()设为通用类型。

类似的东西:

var listType = typeof(List<>).MakeGenericType(new[]{typeof(T)});
if (property.PropertyType.IsGenericType 
  && listType.IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition()))

有关MakeGenericType的更多信息:https://msdn.microsoft.com/en-us/library/system.type.makegenerictype

var testList = property.GetValue(this, new object[] { });

您确定传递了正确的对象实例吗? this在这里?

它应该是var testList = property.GetValue(FooList, new object[] { });&lt; - FooList

答案 1 :(得分:1)

这是一个错字吗?从中读取属性而不是模型:

var testList = property.GetValue(model, new object[] { });
                                 ^^^^^