4

我有以下代码:

public class Class1
{
    void ValueSpecific(string arg)
    {
        // do string stuff
    }
    void ValueSpecific(int arg)
    {
        // do int stuff
    }
    void ValueSpecific(float arg)
    {
        // do float stuff
    }
    void ValueGeneric(string arg)
    {
        // do stuff
        ValueSpecific(arg);
        // do more stuff
    }
    void ValueGeneric(int arg)
    {
        // do stuff
        ValueSpecific(arg);
        // do more stuff
    }
    void ValueGeneric(float arg)
    {
        // do stuff
        ValueSpecific(arg);
        // do more stuff
    }
    void Main(string s, int i, float f)
    {
        ValueGeneric(s);
        ValueGeneric(i);
        ValueGeneric(f);
    }
}

这可行,但 ValueGeneric 的所有三个重载的主体都是相同的。我想将它们合并为一种方法,如下所示:

void ValueGeneric<T>(T arg) where T: string, float, int
{
    // do stuff
    ValueSpecific(arg);
    // do more stuff
}

但这当然不是有效的 C#。我能想到的最好的是:

void ValueGeneric(object arg)
{
    // Do stuff
    if (arg is int)
    {
        ValueSpecific((int)arg);
    }
    else if (arg is string)
    {
        ValueSpecific((string)arg);
    }
    else if (arg is float)
    {
        ValueSpecific((float)arg);
    }
    else
    {
        Debug.Assert(false, "Invalid type)
    }
    // Do more stuff
}

但这似乎很不雅。我会很感激任何建议。(虽然我会对任何解决方案感兴趣,但 .NET3.5 支持的解决方案是最好的,因为这就是我正在使用的。)

4

3 回答 3

2

假设您在所有重载之前和之后都在做同样的事情,您可以应用通常的方法来分解代码中的不同之处并将它们参数化。唯一改变的是传入的参数和您对该参数执行的操作。把他们俩都传进去。

static void ValueGeneric<T>(T arg, Action<T> action)
{
    // do stuff
    action(arg);
    // do more stuff
}

然后使用适当的操作调用泛型方法(您的ValueSpecific重载将很好地自行解决)。

ValueGeneric(s, ValueSpecific);
ValueGeneric(i, ValueSpecific);
ValueGeneric(f, ValueSpecific);
于 2012-07-21T09:05:32.717 回答
0

根据我对其他大型 .NET 项目的了解,您可以同时包含特定和通用重载。如果不存在特定的重载,他们将只使用通用版本:

void ValueGeneric(int i);
void ValueGeneric(string s);
void ValueGeneric(float f);
void ValueGeneric<T>(T t);

根据您发布的代码的结构,您似乎想对 的内容之前和之后的所有类型做一些事情ValueSpecific,因此您可以将所有重载在开头和结尾调用的私有PreValueGeneric和方法设置为避免代码之间的重复过载。PostValueGenericValueGeneric

于 2012-07-21T09:08:47.283 回答
0

您是否考虑过为每种类型使用扩展方法?对于这种情况,它可能是一种替代方案。

您可以定义一个类并定义该方法。喜欢:

namespace ExtensionMethods
{
    public static class Class1
    {
        static void ValueSpecific(this string arg)
        {
            // do string stuff
        }
        static void ValueSpecific(this int arg)
        {
            // do int stuff
        }  
    }
}

然后,当您想使用它们时,只需执行

Int32 myIntVar = 20;
myIntVar.ValueSpecific();
String myStringVar = "hi",
myStringVar.ValueSpecific();

你将不得不添加

using ExtensionMethods;

只声明方法并使用它们。

于 2012-07-21T09:40:47.973 回答