0

可以像 C++ 函数重载那样重载 C3 泛型方法吗?

下面的代码是重载泛型方法的正确方法吗

class ReadFile<T> : IDisposable
{

    private FileStream fstream;
    private BinaryReader br;

    public ReadFile(string filename)
    {
       // do all the initialization
    }

    public void readValue(double val)
    {
       val = br.ReadDouble();
    }

    public void readValue(float val)
    {
       val = br.ReadSingle();
    }

    public void readValue(T val)
    {
       throw new Exception("Not implemented");
    }
}
4

2 回答 2

3

您需要模板化 readValue 方法,而不是模板化类。然后,您可以使用良好的老式重载来实现显式类型。不要忘记将out关键字添加到您的 readValue 参数中。快速控制台应用演示:

class Program
{
    static void Main(string[] args)
    {
        var rf = new ReadFile();

        double d;
        float f;
        int i;

        Console.WriteLine(string.Format( "{1}: {0}", rf.readValue(out d), d ));
        Console.WriteLine(string.Format( "{1}: {0}", rf.readValue(out f), f ));
        // note you don't have to explicitly specify the type for T
        // it is inferred
        Console.WriteLine(string.Format( "{1}: {0}", rf.readValue(out i), i ));

        Console.ReadLine();
    }
}

public class ReadFile
{
    // overload for double
    public string readValue(out double val)
    {
        val = 1.23;
        return "double";
    }

    // overload for float
    public string readValue(out float val)
    {
        val = 0.12f;
        return "float";
    }

    // 'catch-all' generic method
    public string readValue<T>(out T val)
    {
        val = default(T);
        return string.Format("Generic method called with type {0}", typeof(T));
    }
}
于 2013-10-03T15:27:41.273 回答
0

虽然有些人反对将泛型用于您所描述的事情,但有时它们是合适的。尽管如此,对于不同的类型执行不同的代码并没有特别方便的模式。可能最好的方法是让你private static Action<T> readProc = InitReadProc;拥有通用ReadValue(T val)调用readProc(val)。该InitReadProc方法可能类似于:

ReadFile<float>.readProc = readValue; // Binds to `float` overload
ReadFile<double>.readProc = readValue; // Binds to `double` overload
// etc. for all known overloads
if (readProc == InitReadProc) // The readProc of *this* type (T) didn't get set above
  throw new NotSupportedException(String.Format("Type {0} not available", typeof(T));
else
  readProc();

使用这种方法,第一次尝试readValue为任何类型调用泛型时,它将填充readProc所有已知类型的委托。任何未来调用任何此类类型的尝试readValue都将通过委托分派给适当的方法。请注意,如果需要,可以提供一种ConfigureReadProc<T>(Action<T> proc)方法来允许该类的使用者为其他类型设置ReadFile方法。如果需要,也可以使用反射来检查类型是否T支持静态readValue(T)方法,如果支持,则将委托附加到该方法。

于 2013-10-03T15:16:09.317 回答