将通用扩展函数转换为简单的遗留函数
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[][]
(T
是int[]
) 让它工作。你可能只想:
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 的类型?或在打字稿中扩展通用函数接口以具有进一步的通用性?