【问题标题】:How to convert type known at runtime to a List of given type?如何将运行时已知的类型转换为给定类型的列表?
【发布时间】:2016-01-22 16:02:00
【问题描述】:

我有一种类型,我只在运行时才知道:

Type givenType = FindOutTypeOf(someObject);

我有以下方法:

public void SomeMethod(Type type);

我需要使用 List<givenType> 类型调用它。

如何将给定类型(我在运行时知道的)转换为给定类型的列表?

【问题讨论】:

  • 你的意思是如何创建给定类型的列表?如果是这样:stackoverflow.com/questions/4661211/…
  • 不,我需要传递类型(C# 类),它是我检索到的给定类型的列表。我将把 var 改成 Type in the questions
  • 嗯,你的答案仍然是here,你只是不需要打电话给Activator.CreateInstanceconstructedListType就是你要找的。​​span>
  • 可以更改 SomeMethod 的签名吗?
  • 所以例如如果givenTypetypeof(string),那么你需要用typeof(List<string>)调用SomeMethod

标签: c# .net reflection


【解决方案1】:

试试这个

var listType = typeof(List<>);
var constructedListType = listType.MakeGenericType(givenType);

【讨论】:

    【解决方案2】:

    如果我理解正确,您所问的问题不能以通用和优雅的方式用强类型语言完成。

    这样想: 如果 可以是字面上的任何东西,包括在运行时生成的类型,你就不能创建一个强类型列表,其中 t 是 typeof()。

    如果您不希望在运行时生成任何类型,我会尝试重构您的解决方案以使用泛型类型。如果出于某种原因您需要为每种类型执行自定义操作,您始终可以在基类中抽象出通用逻辑,然后它们会创建一个派生类型,您可以在其中为该类型实现自定义逻辑。

    如果这不符合您的需求,您可以使用 C# 提供的 关键字,但这并不能保证类型安全,并且您可能会遇到运行时异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      相关资源
      最近更新 更多