如何在运行时制作通过GetType(“ Class Name”)获得的类型的List <>?

时间:2019-04-02 08:13:52

标签: c#

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

我有不同类别的不同清单

我可以通过操作访问我想要的内容

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

这很棒,我可以通过其名称访问不同类别的List<>并获取/更改内容

但是现在我想将其与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<>的名字 -我想用该名称修改该类的任何列表

1 个答案:

答案 0 :(得分: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的类。我们引入了 small 少量的基于表达式的魔术师,以使我们在编译时花一小段“额外”时间并跨越鸿沟。

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