将通用扩展函数转换为简单的遗留函数

Posted

技术标签:

【中文标题】将通用扩展函数转换为简单的遗留函数【英文标题】: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[] 【参考方案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 方法。我的帖子只是一个工作示例,我需要对其进行重构。再次感谢。

以上是关于将通用扩展函数转换为简单的遗留函数的主要内容,如果未能解决你的问题,请参考以下文章

通用无状态组件 React 的类型?或在打字稿中扩展通用函数接口以具有进一步的通用性?

Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析

PHP手册-函数参考-日期与时间相关扩展

JS 函数未定义 Chrome 扩展 Popup.js

systemverilog 为啥要用$cast类型转换函数

在 DateFormatter 扩展中包含日期转换器功能