我正在尝试从其他地方检索的特定类型创建通用列表:
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);
}
}
}
答案 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();