如何在C#中以编程方式执行方法重载解析?

汽水

当C#编译器解释方法调用时,它必须使用(静态)参数类型来确定实际正在调用的重载。我希望能够以编程方式执行此操作。

如果我有方法(a string的名称,声明它的类型(的实例System.Type)和参数类型列表,我希望能够调用标准库函数并获取MethodInfo代表该方法的对象,该对象是C#编译器会选择调用。

例如,如果我有

class MyClass {
  public void myFunc(BaseClass bc) {};
  public void myFunc(DerivedClass dc) {};
}

然后,我想是这样的虚构功能GetOverloadedMethodSystem.Type

MethodInfo methodToInvoke
  = typeof(MyClass).GetOverloadedMethod("myFunc", new System.Type[] {typeof(BaseClass)});

在这种情况下methodToInvoke应该public void myFunc(BaseClass bc)

注意:无论是方法GetMethodGetMethods将成为我的目的。它们都不执行任何重载解析。在这种情况下,GetMethod它仅返回完全匹配项。如果给它更多派生参数,它将什么都不返回。否则,您可能很幸运地获得了不提供任何有用信息的歧义异常。

肖恩·卢汀(Shaun Luttin)

回答

Type.GetMethod(String name, Type[] types)做编程重载决议。这是一个例子:

MethodInfo methodToInvoke = typeof(MyClass)
    .GetMethod("myFunc", new System.Type[] { typeof(BaseClass) });

解释

在示例中,methodToInvokemyFunc(BaseClass bc)不是myFunc(DerivedClass dc),因为types数组指定要获取的方法的参数列表。

从MSDN文档开始Type.GetMethod(String name, Type[] types)具有两个参数:

  • name 是要获取的方法的名称,并且
  • types 提供方法参数的顺序,数量和类型。

运行代码

这是一个正在运行的小提琴,它演示了程序重载解决方案。

using System;
using System.Reflection;

public static class Program
{
    public static void Main()
    {
        MethodInfo methodToInvoke = typeof(MyClass)
            .GetMethod("myFunc", new System.Type[] { typeof(BaseClass) });

        var result = methodToInvoke
            .Invoke(new MyClass(), new object[] { new BaseClass() });

        Console.WriteLine(result);      
    }

    public class MyClass
    {
        public static string myFunc(BaseClass bc) {
            return "BaseClass";
        }

        public static string myFunc(DerivedClass dc) {
            return "DerivedClass";
        }
    }

    public class BaseClass { }
    public class DerivedClass : BaseClass { }
}

输出为BaseClass

编辑:这是鲁棒的。

GetMethod解决的方法采用params,更多派生的类,委托和接口实现。这个小提琴演示了所有这些情况这是电话及其检索的内容。

适用于 params

MethodInfo methodToInvoke2 = typeof(MyClass).GetMethod(
        "myFunc",
        new System.Type[] { typeof(Int32[]) });

将解决此方法

public static string myFunc(params int[] i)
{
    return "params";
}

与更多派生类一起使用

MethodInfo methodToInvoke3 = typeof(MyClass).GetMethod(
    "myFunc", 
    new System.Type[] { typeof(MoreDerivedClass) });

解决采用 MoreDerivedClass

public class BaseClass { }
public class DerivedClass : BaseClass { }
public class MoreDerivedClass : DerivedClass {}

与代表一起工作

MethodInfo methodToInvoke4 = typeof(MyClass).GetMethod(
    "myFunc", 
    new System.Type[] { typeof(MyDelegate) });

...将检索采用此委托的方法:

public delegate void MyDelegate(string x);

与接口实现一起使用

MethodInfo methodToInvoke5 = typeof(MyClass).GetMethod(
   "myFunc", 
   new System.Type[] { typeof(MyImplementation) });

...成功检索了一个方法 MyImplementation

public interface IMyInterface {}
public class MyImplementation : IMyInterface {}

因此,它很健壮,可以GetMethod在可能无法正常工作的情况下使用重载解析。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#中以编程方式启用MSMQ?

来自分类Dev

如何在C#中调用泛型重载方法

来自分类Dev

如何在C#中创建泛型方法重载?

来自分类Dev

如何在Visual Studio中以编程方式执行“转到定义”?

来自分类Dev

如何在Spring 3中以编程方式执行注销

来自分类Dev

如何在Java中以编程方式执行功能检测?

来自分类Dev

如何在WPF C#中以编程方式更改ContentControl中的UserControl

来自分类Dev

如何在C#中以编程方式在Apache Drill的存储插件中创建连接

来自分类Dev

如何在C#中以编程方式减少xml文件的大小

来自分类Dev

如何在WebDriver C#中以编程方式获取FindsBy属性值

来自分类Dev

如何在C#,Sharepoint 2010中以编程方式删除列表的视图?

来自分类Dev

如何在C#中的ProgressTemplate内以编程方式更改跨度文本?

来自分类Dev

如何在C#中以编程方式获取DNS后缀搜索列表

来自分类Dev

如何在C#中的ProgressTemplate内以编程方式更改跨度文本?

来自分类Dev

如何在 c# winform 中以编程方式检查复选框?

来自分类Dev

如何在C中执行参数解析?

来自分类Dev

在C#中执行查询后,如何获取在SQLManagementStudio中显示的消息的方法是什么(编程)

来自分类Dev

如何在C / C ++中以编程方式创建软链接?

来自分类Dev

如何在C#WPF中以编程方式创建DataGrid?

来自分类Dev

C#中重载函数的执行顺序

来自分类Dev

如何在C#中延迟执行

来自分类Dev

如何在C#中以编程方式填写另一个程序的弹出字段?

来自分类Dev

如何在ASP.NET MVC和C#应用程序中以编程方式修改web.config?

来自分类Dev

如何在MATLAB编辑器中以编程方式执行“折叠全折叠”?

来自分类Dev

如何在Android最新版本中以编程方式执行UiAutomator测试用例

来自分类Dev

如何在Windows上以编程方式执行ping测试?

来自分类Dev

如何在C#中以更通用的方式编写这些方法?

来自分类Dev

如何在C#中以更通用的方式编写这些方法?

来自分类Dev

如何在Windows Service C#中的方法中同步执行所有语句

Related 相关文章

  1. 1

    如何在C#中以编程方式启用MSMQ?

  2. 2

    如何在C#中调用泛型重载方法

  3. 3

    如何在C#中创建泛型方法重载?

  4. 4

    如何在Visual Studio中以编程方式执行“转到定义”?

  5. 5

    如何在Spring 3中以编程方式执行注销

  6. 6

    如何在Java中以编程方式执行功能检测?

  7. 7

    如何在WPF C#中以编程方式更改ContentControl中的UserControl

  8. 8

    如何在C#中以编程方式在Apache Drill的存储插件中创建连接

  9. 9

    如何在C#中以编程方式减少xml文件的大小

  10. 10

    如何在WebDriver C#中以编程方式获取FindsBy属性值

  11. 11

    如何在C#,Sharepoint 2010中以编程方式删除列表的视图?

  12. 12

    如何在C#中的ProgressTemplate内以编程方式更改跨度文本?

  13. 13

    如何在C#中以编程方式获取DNS后缀搜索列表

  14. 14

    如何在C#中的ProgressTemplate内以编程方式更改跨度文本?

  15. 15

    如何在 c# winform 中以编程方式检查复选框?

  16. 16

    如何在C中执行参数解析?

  17. 17

    在C#中执行查询后,如何获取在SQLManagementStudio中显示的消息的方法是什么(编程)

  18. 18

    如何在C / C ++中以编程方式创建软链接?

  19. 19

    如何在C#WPF中以编程方式创建DataGrid?

  20. 20

    C#中重载函数的执行顺序

  21. 21

    如何在C#中延迟执行

  22. 22

    如何在C#中以编程方式填写另一个程序的弹出字段?

  23. 23

    如何在ASP.NET MVC和C#应用程序中以编程方式修改web.config?

  24. 24

    如何在MATLAB编辑器中以编程方式执行“折叠全折叠”?

  25. 25

    如何在Android最新版本中以编程方式执行UiAutomator测试用例

  26. 26

    如何在Windows上以编程方式执行ping测试?

  27. 27

    如何在C#中以更通用的方式编写这些方法?

  28. 28

    如何在C#中以更通用的方式编写这些方法?

  29. 29

    如何在Windows Service C#中的方法中同步执行所有语句

热门标签

归档