分派基于数组参数类型的递归泛型函数调用

本文关键字:类型 递归 泛型 函数调用 参数 于数组 数组 分派 | 更新日期: 2023-09-27 18:17:56

根据参数是任意深维数组还是非数组(值),编写一个对于给定类型表现不同的函数。对于数组类型,重载遍历数组并递归。

我希望递归调用子数组的递归调用数组参数重载。然而,递归调用直接指向值类型overload。我宁愿避免基于运行时的功能,如自省。

使用Visual Studio 2010 . net 4,尽管也希望支持。net 3.5。

namespace Quickie.StackOverflow.GenericMethodDispatch
{
    class TestGenericMethodDispatch
    {
        static private void GenericDereferenceArray<T>(T t)
        {
            Console.WriteLine(string.Format("GenericDereferenceArray<T>(T t) got a {0} which thinks it's a {1}, {2}", typeof(T), t.GetType(), t));
        }
        static private void GenericDereferenceArray<T>(T[] t)
        {
            Console.WriteLine(string.Format("GenericDereferenceArray<T>(T[] t) got a {0} which thinks it's a {1}", typeof(T[]), t.GetType()));
            foreach (T iter in t)
            {
                GenericDereferenceArray(iter);
            }
        }
        static public void TestGenericDereferenceArray()
        {
            Console.WriteLine();
            Console.WriteLine("===TestGenericDereferenceArray()===");
            Console.WriteLine("====Dereference an int====");
            int i = 1;
            GenericDereferenceArray(i);
            Console.WriteLine();
            Console.WriteLine("====Dereference an int[]====");
            int[] ai = { 1 };
            GenericDereferenceArray(ai);
            Console.WriteLine();
            Console.WriteLine("====Dereference an int[][]====");
            int[][] aai = { new int[] { 2 } };
            GenericDereferenceArray(aai);
            Console.WriteLine();
        }
    } // Ends class TestGenericMethodDispatch
} // Ends namespace Quickie.StackOverflow.GenericMethodDispatch
输出:

= = = TestGenericDereferenceArray () = = =
====取消对字符串的引用====
GenericDereferenceArray(T)得到一个系统。字符串,认为它是一个系统。字符串,foo

====对int对象解引用====
GenericDereferenceArray(T)得到一个系统。Int32认为它是一个系统。Int32, 1

====解引用int[]====
GenericDereferenceArray(T[] T)得到一个系统。Int32[]认为它是一个系统。Int32 []
GenericDereferenceArray(T)得到一个系统。Int32认为它是一个系统。Int32, 1

====解引用int[][]====
GenericDereferenceArray(T[] T)得到一个系统。Int32[][]认为它是一个系统。Int32 [] []
GenericDereferenceArray(T)得到一个系统。Int32[]认为它是一个系统。Int32[],系统。Int32 []

希望后一个输出是

====解引用int[][]====
GenericDereferenceArray(T[] T)得到一个系统。Int32[][]认为它是一个系统。Int32 [] []
GenericDereferenceArray(T[] T)得到一个系统。Int32[]认为它是一个系统。Int32 []
GenericDereferenceArray(T)得到一个系统。Int32认为它是一个系统。Int32,系统。Int32

分派基于数组参数类型的递归泛型函数调用

因为GenericDereferenceArray(iter)调用GenericDereferenceArray<T>(T t),即使它是一个数组。您可以在GenericDereferenceArray<T>(T t)中检查数组(或更通用的IEnumerable):

    static private void GenericDereferenceArray<T>(T t)
    {
        Console.WriteLine(string.Format("GenericDereferenceArray<T>(T t) got a {0} which thinks it's a {1}, {2}", typeof(T), t.GetType(), t));
        if (t is IEnumerable)
            foreach (var t2 in (IEnumerable)t)
            {
                GenericDereferenceArray(t2);
            }
    }

当您将int[][]作为参数传递给期望T[]的方法时,这使得T的类型为int[],这就是您在输出中看到的。为了使它像你想要的那样工作,你必须在你的方法中对这种情况有特殊的处理。

或者为T[][]添加另一个重载