分派基于数组参数类型的递归泛型函数调用
本文关键字:类型 递归 泛型 函数调用 参数 于数组 数组 分派 | 更新日期: 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[][]
添加另一个重载