我正在实现动态功能,不需要每次添加功能时都添加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<>
的名字
-我想用该名称修改该类的任何列表
答案 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时还需要做更多的工作,但是我在这里不做详细介绍。