【发布时间】:2015-02-07 16:22:53
【问题描述】:
我有一个包含方法重载的类:
public static void Foo(string a, string b)
public static void Foo(DateTime a, DateTime b)
public static void Foo<T>(ICollection<T> a, T b)
public static void Foo<T>(T a, ICollection<T> b)
public static void Foo<T>(ICollection<T> a, ICollection<T> b)
public static void Foo<T, U>(T a, U b) where T : IComparable
public static void Foo<T, U>(T a, U b)
我以这种方式在运行时检索所有方法:
var methods = typeof(MyClass).GetMethods(BindingFlags.Public | BindingFlags.Static);
对于两个给定的参数类型(例如:typeof(int)、typeof(List<int>))我想动态选择最合适的方法。
到目前为止我尝试/检查的内容:
-
Binder.SelectMethod():该方法不支持泛型。 typeof().IsAssignableFrom():同上。对泛型参数有一些支持(例如:提供泛型参数T并且它对int类型的约束将被正确评估)但不支持带有参数的泛型类型(例如:List<int>vsList<>或 vs @987654331 @(此类型来自泛型方法,可能T包含一些约束)使用所有泛型方法的输入参数调用
MakeGenericMethod(),并捕获参数异常直到没有:丑陋。 它可能需要完成一些额外的工作,因为我提供给MakeGenericMethod()的类型可能与我收到的初始类型不完全相同(例如:我有typeof(List<int>), typeof(int),而我应该提供typeof(int)到MakeGenericMethod().
我知道这是一个复杂的话题,不是小问题,但有一些问题已经解决,应该会让事情变得更容易:
- 所有方法都有两个参数和相同的返回类型
- 没有可选类型,没有数组。
- 泛型方法不再有一个或两个泛型参数,参数的顺序始终相同。
- 不需要支持协变/逆变
- 方法已按“优先级”排序。这就是为什么没有限制的通用版本位于此列表的末尾。 一旦一种方法匹配,我们就可以接受它并忽略其他方法
我想知道是否有办法使用 C# 框架中的现有类/方法来解决这些重载(无需重新发明轮子),如果不可能的话,什么是可能的解决方案(自定义代码)
【问题讨论】:
标签: c# generics reflection runtime overloading