【问题标题】:How to make a List<> of a type obtained with GetType("Class Name") at runtime?如何在运行时创建使用 GetType("Class Name") 获得的类型的 List<>?
【发布时间】:2019-04-02 17:21:44
【问题描述】:

我正在实现一些动态的东西,不需要每次添加功能时都添加 X 行代码

我有不同类别的不同列表

我可以通过做访问我想要的东西

List<AutoPath> temp = (List<AutoPath>)typeof(QuestActions).GetProperty("autoPath").GetValue(Quests.Actions, null);

太好了,我可以通过名称访问不同类中的 List&lt;&gt; 并获取/更改内容

但现在我想把它和GetType()结合起来

Type t = Type.GetType("ChineeseRevolution.Actions.AutoPath");

我试过了

Type t = Type.GetType("ChineeseRevolution.Actions.AutoPath");
List<t> temp = (List<t>)typeof(QuestActions).GetProperty("autoPath").GetValue(Quests.Actions, null);

但它不让我

在运行时

总结一下: - 我在另一个班级有一个公共List&lt;&gt; 的名字 - 我想用它的名字修改那个类的任何列表

【问题讨论】:

  • 或者似乎每次添加X行代码会更快更简单;)
  • 你不能声明一个 variable 是“一些我在运行时才知道的 specific 类型”。您当然可以将其声明为 objectdynamic 但当然您会失去智能感知等。
  • 我不同意建议的欺骗,因为这里的 OP 似乎试图获取 现有 列表,而不是创建一个新列表。

标签: c#


【解决方案1】:

假设您在编译时不知道类型,但其他人会在他们的编译时知道类型。如果是这种情况,您可以编写一个接受该类型作为类型参数的泛型方法:

static void DoSomethingWithList<TList>()
{
  var list =  (List<TList>)typeof(QuestActions)
       .GetProperty("autoPath")
       .GetValue(Quests.Actions, null);
  //Do stuff with List
}

然后这个在编译时知道它的其他代码可以调用这个方法。

但是,你反对,这不是这里的情况 - 你是直到运行时才知道类型的人。但这对我们在这里引入一点“桥接”是没有问题的。在另一种方法中,我们这样做:

  var t = Type.GetType("ChineeseRevolution.Actions.AutoPath");
  var x = Expression.Call(
     typeof(Program).GetMethod(
     nameof(DoSomethingWithList),
     System.Reflection.BindingFlags.Static|System.Reflection.BindingFlags.NonPublic)
     .MakeGenericMethod(t));
  var y = Expression.Lambda(x);
  y.Compile().DynamicInvoke();

其中System.Linq.Expressions 假定在此代码上方的 using 指令中,Program 是包含 DoSomethingWithList 的类。我们引入了 少量 的基于表达式的魔法,以使我们获得少量的“额外”编译时间并跨越鸿沟。

如果您有更多类型,请尝试将它们全部从“运行时已知”“跳转”到“通用参数”。如果你有额外的参数需要随行,那么在设置调用和 lambda 时需要做更多的工作,但我不会在这里详细介绍。

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多