【发布时间】:2018-05-20 22:04:13
【问题描述】:
我的目标: 我有一个系统,我希望其他人能够添加一个 C# 脚本,其中包含我可以在运行时从另一个类中查找和执行的特定方法。
我的方法: 我创建了一个带有方法的接口,因此我可以遍历任何使用反射实现该接口的类并列出它们,然后让所有这些类之间的方法名称相同。
我的类包含在查找过程中找到的所有类的枚举,用户可以在运行时在它们之间进行选择。
我现在需要能够获取所选类类型的方法并调用它的方法,问题是我确定方法的名称但类的类型存储为变量。
守则:
//内存中的伪代码:
//Possible solution 1:
Type selectedType = typeSelectedByEnum;
MethodInfo genericMethod = selectedType.GetMethod("TheInterfaceMethod").MakeGenericMethod(selectedType);
genericMethod.Invoke(selectedType, new object[0]);
//Possible solution 2: (however I would much prefer to use something avaliable prior to .NET 4.6)
Type selectedType = typeSelectedByEnum;
dynamic changedObj = Convert.ChangeType(selectedType, selectedType);//-Something here needs to implement IConvertable, how would I set this up?
changedObj.TheInterfaceMethod();
//Possible solution 3:
//Your solution??!
感谢您的帮助,在这一点上,我已经尝试了很多事情,并且对任何可能的运行时替代方案持开放态度。如有需要,我可以提供更多代码。
【问题讨论】:
-
在我看来您正在寻找
Type selectedType = Type.GetType(fullTypeNameAsString);- 然后您在解决方案 1 中已经拥有什么?解决方案 1 现在会发生什么?另外:TheInterfaceMethod是实例方法吗?还是静态方法?如果是实例方法:它应该使用什么对象?如果是静态方法:将null传递给第一个参数 -
您的选择列表可以包含实际对象吗?将显示的名称放在通用界面上而不是枚举上。然后,您可以直接从所选对象调用该方法。
-
@user6144226 不错;如果这些对象实际上在
List<ISomeInterface>中,您可以只使用theList[(int)enumValue].TheInterfaceMethod(); -
你为什么用MakeGenericMethod,是接口Generic中的方法吗?
-
您创建这些类可以调用这些方法的频率是多少?