首先,我有一些遗留.NET 2
代码,我需要将扩展函数转换为一个简单的函数。所以我将从我想要实现的目标开始。
我有两个对象数组,可以是int
之类的任何对象,例如
int[] a = new int[] { 1, 2, 3 };
int[] b = new int[] { 4, 5, 6 };
我唯一想做的就是:
var y = Concat(a, b);
然后返回一个数组。
问题是我无法弄清楚正确的组合以转换以下功能。
public static class GenericExt
{
public static T Concat<T>(this T[] args, T[] args2)
{
if (!typeof(T).IsArray) throw new ArgumentException("Concat accepts only arrays");
Type elementType = typeof(T).GetElementType();
Array array = Array.CreateInstance(elementType, args.Length + args2.Length);
args.CopyTo(array, 0);
args2.CopyTo(array, args.Length);
return (T)(object)array;
}
}
感谢任何更正和帮助。
答案 0 :(得分:1)
我唯一想做的就是:
var y = Concat(a, b);
然后返回一个数组。
除非您与方法(或子类)在同一个类中,否则不能这样做。您可以通过从参数列表中删除this
部分来阻止它成为扩展方法 - 但调用必须是:
var y = GenericExt.Concat(a, b);
另一种选择是提供您自己的ExtensionAttribute
类(在正确的命名空间中),并继续使用它作为扩展方法。扩展方法所需的框架中仅 的东西就是该属性,您只需将声明复制出MSDN即可。请注意,如果您从.NET 3.5+库/应用程序中引用库,那么它将导致问题,其中属性是框架的一部分......但如果一切都是.NET 2,那么您应该没问题。
请注意,此时实现已被破坏 - 在执行时,您只接受也是数组的类型参数...因此您实际上需要传入int[][]
(使用{{ 1}}正在T
)让它发挥作用。你可能只想要:
int[]
但这是当前实现中的一个错误,它与扩展方法无关。