2

我有以下列表:

public List<EntityBase> PossibleReplacements

我也有一个类型

public Type type;

type 将包含某个继承 EntityBase 的类类型(这就是我的应用程序的工作方式)。现在我需要将列表 PossibleReplacements 转换为“type”类型的列表

像这样的东西:

List<type> lijst = PossibleReplacements.Cast<type>();

但这给出了一个错误

'ReplacePopupModel.type' is a 'field' but is used like a 'type' 

我还没有找到一个可行的解决方案。

谁能帮我吗?

谢谢。

4

3 回答 3

1

您不能使用Cast,因为它在运行时不是类型安全的,您只需用于where选择:

var lijst = PossibleReplacements.Where(t => t.GetType() == type);
于 2013-03-25T16:53:29.953 回答
1

您可以像这样获取与类型匹配的项目:

List<EntityBase> list = PossibleReplacements.Where(e => type.IsAssignableFrom(e.GetType())).ToList();

此列表将仅包含与您在 中指定的特定类型匹配(或属于其子类)的项目type

但是,您不能强制转换为特定List<T>类型,因为这在编译时是未知的。

如果您尝试提取在编译时已知的特定类型的项目,您可以使用:

List<TheType> list = PossibleReplacements.OfType<TheType>().ToList();
于 2013-03-25T16:57:17.393 回答
0

不是没有反思,也不是安全的。但是您可以按照 Reed Copseys 的第一个提示检查是否所有条目都可以分配给您的类型,然后使用反射转换方法:

var type = ...your type...

var cast = typeof(IEnumerable<>).GetMethod("Cast").MakeGenericMethod(type);
var list = cast.Invoke(PossibleReplacements, null);

变量listnow object,但引用了正确类型的列表。由于您不知道您的实际类型,您可能有一些接口来访问列表(需要强制转换)。

于 2013-03-25T17:02:05.120 回答