public static object GetObject(int x)
{
    return new object { };
}
public static object GetObject(string x)
{
    return new object { };
}
public static void ProcessObject<T>(T x) where T : int, string <= got error here:
{
    object o = GetObject(x);
}


得到错误“用作约束的类型必须是接口,未密封的类或类型参数”。

我如何重写代码以使其工作而无需两次编写ProcessObject(int x)ProcessObject(string x)

最佳答案

因此,您现在所拥有的(根据公认的答案和您的评论)是:

public static void ProcessObject<T>(T x)
{
    object o;
    if (typeof(T) == typeof(int))
        o = GetObject((int)(object)x);
    else if (typeof(T) == typeof(string))
        o = GetObject((string)(object)x);
    else
        throw new Exception();
    // do stuff with o
}


我建议公开intstring重载,但是为了防止代码重复,请在内部调用另一个方法:

public static void ProcessObject(int x)
{
    ProcessObject(GetObject(x));
}
public static void ProcessObject(string x)
{
    ProcessObject(GetObject(x));
}
private static void ProcessObject(object o)
{
    // do stuff with o
}


这使您的public方法的输入值清晰可见:intstring是唯一可接受的类型,同时仍然不会重复您的实际逻辑(// do stuff with o)。

您可能不喜欢这两个公共的ProcessObject方法是彼此重复的(无论如何,从表面上看;在幕后,它们调用了两个不同的GetObject重载),但我认为这是最好的选择。

10-08 02:25