使用C#Type作为通用

时间:2010-06-08 04:47:52

标签: c# generics

我正在尝试从其他地方检索的特定类型创建通用列表:

Type listType; // Passed in to function, could be anything
var list = _service.GetAll<listType>();

但是我遇到了构建错误:

The type or namespace name 'listType' could not be found (are you missing a using directive or an assembly reference?)

这是可能的还是我踏上C#4动态领域?

作为背景:我想自动加载包含存储库中数据的所有列表。下面的代码传递了一个表单模型,其属性被迭代为任何IEnum(其中T继承自DomainEntity)。我想用列表中的类型列表填充列表。

public void LoadLists(object model)
{
    foreach (var property in model.GetType()
        .GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty))
   {
        if (IsEnumerableOfNssEntities(property.PropertyType))
        {
            var listType = property.PropertyType.GetGenericArguments()[0];

            var list = _repository.Query<listType>().ToList();

            property.SetValue(model, list, null);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

您不能将变量作为泛型类型/方法参数传递,但是您可以使用反射执行一些简单的操作,例如,您可以这样构造列表:

Type listType = typeof(int);
var list = Activator.CreateInstance(typeof(List<>).MakeGenericType(listType));

不确定它是否有用,因为您需要将该列表转换为某些内容以使其有用,并且您无法简单地将其转换为泛型类型/接口而不指定泛型类型参数。

您仍然可以通过将此类列表转换为非通用版本的接口ICollection,IList,IEnumerable来添加/枚举此类列表。

答案 1 :(得分:0)

您需要告诉它listType的类型

var list = _repository.Query<typeof(listType)>().ToList();