gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:39:49 26 4
gpt4 key购买 nike

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

如果我有方法的名称(字符串)、声明它的类型(System.Type 的实例)和参数类型列表我希望能够调用一个标准库函数并取回一个 MethodInfo 对象,该对象表示 C# 编译器将选择调用的方法。

例如如果我有

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

然后我想要类似 System.Type 上的虚构函数 GetOverloadedMethod 的东西

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

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

注意:方法GetMethodGetMethods 都不能达到我的目的。他们都不做任何重载决议。在 GetMethod 的情况下,它只返回完全匹配。如果你给它更多的派生参数,它什么也不会返回。或者您可能很幸运得到一个不提供任何有用信息的歧义异常。

最佳答案

回答

使用 Type.GetMethod(String name, Type[] types) 进行编程重载解析。这是一个例子:

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

说明

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

From the MSDN documentation , Type.GetMethod(String name, Type[] types) 有两个参数:

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

运行代码

Here is a running fiddle这演示了程序化的重载解决方案。

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、更多派生类、委托(delegate)和接口(interface)实现的方法。 This Fiddle demonstrates all of those cases .以下是调用及其检索的内容。

适用于参数

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) });

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

public delegate void MyDelegate(string x);

与接口(interface)实现一起工作

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

...成功检索采用MyImplementation

的方法
public interface IMyInterface {}
public class MyImplementation : IMyInterface {}

因此,它很健壮,我们可以使用 GetMethod 在我们可能不希望工作的情况下进行重载解析。

关于c# - 如何以编程方式在 C# 中执行方法重载解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com