【问题标题】:Convert generic extension function to simple legacy one将通用扩展函数转换为简单的遗留函数
【发布时间】:2014-10-04 16:35:28
【问题描述】:

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

}

感谢任何更正和帮助。

【问题讨论】:

  • 你不需要这个检查if (!typeof(T).IsArray)并且你应该将返回类型更改为T[]

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


【解决方案1】:

而我唯一想做的就是:var y = Concat(a, b); 然后返回一个数组。

除非您与方法(或子类)在同一个类中,否则您不能这样做。您可以通过从参数列表中删除 this 部分来阻止它成为扩展方法 - 但调用必须是:

var y = GenericExt.Concat(a, b);

另一种选择是提供您自己的ExtensionAttribute 类(在正确的命名空间中),并继续将其用作扩展方法。框架中唯一需要扩展方法的东西就是那个属性,你可以从 MSDN 中复制声明。请注意,如果您从 .NET 3.5+ 库/应用程序中引用该库,则会导致问题,其中该属性是框架的一部分......但如果一切都是 .NET 2,那么您应该没问题。

请注意,目前实现已被破坏-在执行时,您只接受也是数组的类型参数...因此您实际上需要传入int[][]Tint[]) 让它工作。你可能只想:

public static T[] Concat<T>(T[] args, T[] args2)
{
    T[] array = new T[args.Length + args2.Length];
    args.CopyTo(array, 0);
    args2.CopyTo(array, args.Length);
    return array;
}

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

【讨论】:

  • 嗨 Jon 非常荣幸你回答我的帖子。其实跟班无关。我只需要这个函数,因为在.NET 2 中不存在Concat 方法。我的帖子只是一个工作示例,我需要对其进行重构。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2022-11-26
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多