将通用扩展功能转换为简单的旧功能

时间:2014-10-04 16:35:28

标签: c# arrays generics refactoring c#-2.0

首先,我有一些遗留.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;
    }

}

感谢任何更正和帮助。

1 个答案:

答案 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[]

但这是当前实现中的一个错误,它与扩展方法无关。