是否可以基于另一种方法重载方法?

时间:2015-11-04 14:13:20

标签: c# .net vb.net methods overloading

问题标题可能不太清楚,但这是我想要做的事情:

说,我有一个静态类A。该类包含一个名为B的静态函数。它有10多个重载。尽管有这么多的重载,这个功能基本上是基本的。它与班上的其他成员无关。我知道我可以通过导入正确的命名空间并使用:

从任何地方访问它
string bar = A.B("foo", true, 5) // Then do whatever with bar

现在,假设我有另一个班级C(不在A中)。现在我想在D中创建一个名为C的方法,它在所有方面都与A.B相同。我试过了:

public static class C {
    public static string D(string p1, bool p2, int p3) {
        return A.B(p1, p2, p3);
    }
}

但要像D一样重载此A.B方法,我该怎么办?我是否必须手动编写所有单独的重载或者有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

  

我是否必须手动编写所有单独的重载

如果您希望D的每次重载都超载B,那么是的,您必须完全这样做。

答案 1 :(得分:-1)

为什么不将基本方法作为泛型类型的扩展方法,然后在单个扩展方法中简单地实现任何特定于类型的逻辑?

答案 2 :(得分:-3)

这是静态方法缺点的一个很好的例子。

如果可以,可以将这些静态方法转换为实例方法(可能是某些新的worker类,使用静态工厂方法返回实例,或使用IOC)。然后,您可以更灵活地使用继承来避免重复代码。

更新

经过一些反馈,我有一个想法, 可能,有点儿。使用反射获取B的所有版本的参数列表,并与D的参数列表进行比较。

public static int D(params object[] paramArray)
{
    var paramTypes = paramArray.Select(x => x.GetType());
    var method = typeof(Static.A).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy)
        .Where(m => m.Name == "B" && m.GetParameters().Select(x => x.ParameterType).SequenceEqual(paramTypes))
        .FirstOrDefault();
    if (method != null)
    {
        return (int)method.Invoke(null, paramArray);
    }
    throw new Exception("Overloaded method not found");
}

这种方法的缺点是没有参数的编译时检查,没有Intellisense等。我不能想到一种绕过它的方法而不重复每个版本的{{1像这样:

A.B()

在这个解决方案中,D()的每个版本几乎相同,但并不完全相同。理想情况下,您需要某种方式以编程方式将方法的参数列表转换为 private static int GenericD(object[] paramArray, MethodBase caller) { var paramTypes = caller.GetParameters().Select(x => x.ParameterType); var method = typeof(Static.A).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy) .Where(m => m.Name == "B" && m.GetParameters().Select(x => x.ParameterType).SequenceEqual(paramTypes)) .FirstOrDefault(); if (method != null) { return (int)method.Invoke(null, paramArray); } throw new Exception("Overloaded method not found"); } public static int D(string p) { object[] paramArray = new object[] { p }; return GenericD(paramArray, MethodInfo.GetCurrentMethod()); } public static int D(string p, int x) { object[] paramArray = new object[] { p, x }; return GenericD(paramArray, MethodInfo.GetCurrentMethod()); } ,但there doesn't seem to be an easy way to do that