微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 动态调用给定Type变量的方法

我的目标:
我有一个系统,我希望其他人能够添加一个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??!

任何帮助表示赞赏,此时我尝试了很多东西,并且对任何可能的运行时替代方案持开放态度.如有必要,我可以提供更多代码.

解决方法:

由于您使用接口来标记具有方法“TheInterfaceMethod”的类,因此该方法不能是静态的.这意味着您需要一个对象的实例来调用方法. Activator类提供了一种创建对象实例的简单方法,但它确实需要一个具有可见性的认构造函数(在您的情况下很可能是公共构造函数).

我还注意到你的例子的潜在问题是你正在调用“MakeGenericmethod”.仅当函数具有一些您需要定义的具有有意义函数的泛型类型参数时,才需要这样做.比如这个界面:

    interface IInterfaceWithGenericmethod
    {
        void TheInterfaceMethod<T>();
    }

以下是使用变量的示例:

        Type selectedType = typeSelectedByEnum;
        MethodInfo method = selectedType.getmethod("TheInterfaceMethod");
        object obj = Activator.CreateInstance(selectedType);
        method.Invoke(obj, null);

有趣的是,一旦有了对象的实例,就不再需要反射来调用方法了.您只需将其强制转换为界面即可.假设您的接口名为IAwesomeInterface:

        Type selectedType = typeSelectedByEnum;
        object obj = Activator.CreateInstance(selectedType);
        IAwesomeInterface converted = obj as IAwesomeInterface;
        converted.TheInterfaceMethod();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐