问题标签 [extension-methods]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1339 浏览

apache-flex - 是否可以在不继承类的情况下向非动态 ActionScript 3 类添加行为?

我想做的是如下所示:

也就是说,我想用一个方法来扩展一个生成的类,而不是通过继承,而是通过原型。

该类是从 WSDL 生成的,它不是动态类,我不想接触生成的代码,因为无论如何它都会被覆盖。

长话短说,我希望在道德上等同于 C# 3:s 的 AS3 扩展方法。

编辑:我接受了 aib 的回答,因为它最符合我的要求——尽管经过进一步思考,它并不能真正解决我的问题,但这是我提出错误问题的错。:) 另外,upmods 的好建议。

0 投票
11 回答
15565 浏览

c# - 扩展接口模式

.Net 3.5 中的新扩展允许功能从接口中分离出来。

例如在 .Net 2.0

可以(在 3.5 中)变为:

在我看来,这对于许多接口来说是一种更好的机制。他们不再需要一个抽象的基础来共享此代码,并且在功能上代码的工作方式相同。这可以使代码更易于维护和测试。

唯一的缺点是抽象基实现可以是虚拟的,但可以解决这个问题(实例方法会隐藏同名的扩展方法吗?这样做会混淆代码吗?)

还有其他不经常使用这种模式的理由吗?


澄清:

是的,我看到扩展方法的趋势是到处都有它们。在没有大量同行评审的情况下,我会特别小心地使用任何.Net 值类型(我认为我们在字符串上唯一的一个是.SplitToDictionary()- 类似于.Split()但也采用键值分隔符)

我认为那里有一个完整的最佳实践辩论;-)

(顺便说一句:DannySmurf,你的 PM 听起来很吓人。)

我在这里特别询问在以前我们有接口方法的地方使用扩展方法。


我试图避免很多层次的抽象基类——实现这些模型的类大多已经有了基类。我认为与添加更多对象层次结构相比,该模型更易于维护且耦合更少。

这是 MS 对 Linq 的 IEnumerable 和 IQueryable 所做的吗?

0 投票
5 回答
26776 浏览

c# - Generic Map/Reduce List Extensions in C#

I am writing a few extensions to mimic the map and reduce functions in Lisp.

The transform function will cut down on cruft like:

Does this make sense? Could it be better?

0 投票
7 回答
13510 浏览

c# - 如何为泛型类编写 C# 扩展方法

这应该是一个简单的。

我想向 System.Web.Mvc.ViewPage< T > 类添加一个扩展方法。

这个扩展方法应该怎么看?

我的第一个直觉想法是这样的:

解决方案

一般的解决方案是这个答案

扩展 System.Web.Mvc.ViewPage 类的具体解决方案是下面的回答,从通用解决方案开始。

不同之处在于,在特定情况下,您需要一个泛型类型的方法声明和一个将泛型类型强制为引用类型的语句。

0 投票
3 回答
3060 浏览

c# - 扩展方法不适用于接口

受 MVC 店面启发,我正在进行的最新项目是在 IQueryable 上使用扩展方法来过滤结果。

我有这个界面;

我有这个扩展方法

假设我有一个类 SimpleObj,它实现了 IPrimaryKey。当我有一个 SimpleObj 的 IQueryable 时,GetByID 方法不存在,除非我明确地将其转换为 IPrimaryKey 的 IQueryable,这不太理想。

我在这里错过了什么吗?

0 投票
2 回答
1802 浏览

c# - 组织扩展方法

你如何组织你的扩展方法?假设我有对象类和字符串类的扩展,我很想将这些扩展方法分成 IE 类:

我是让这太复杂还是有意义?

0 投票
3 回答
51519 浏览

.net - .NET 列表Concat 与 AddRange

泛型 List 上的AddRangeConcat函数有什么区别?一个比另一个推荐吗?

0 投票
21 回答
175093 浏览

c# - 为什么 IEnumerable 上没有 ForEach 扩展方法?

受到另一个询问缺失Zip功能的问题的启发:

为什么界面上没有ForEach扩展方法?IEnumerable还是在任何地方?唯一获得ForEach方法的类是List<>. 是否有它丢失的原因,也许是性能?

0 投票
11 回答
4841 浏览

c# - 使用这种(基于扩展方法的)速记的可能陷阱

C#6 更新

C#6?.中,现在是一种语言特性

下面的问题仍然适用于旧版本,但如果使用 new 运算符开发新应用程序?.是更好的做法。

原始问题:

我经常想访问可能为空的对象的属性:

等等...

我经常使用它,所以我有一个片段。

在以下情况下,您可以使用内联在某种程度上缩短它:

但是,这有点笨拙,尤其是在设置大量属性或多个级别可以为空的情况下,例如:

我真正想要的是??样式语法,它适用于直接为空的类型:

所以我想出了以下内容:

这让我可以使用这种语法:

这简化了这些调用,但我不确定是否要检查这种扩展方法 - 它确实使代码更易于阅读,但以扩展对象为代价。这会出现在所有东西上,尽管我可以将它放在一个专门引用的命名空间中。

这个例子是一个相当简单的例子,一个稍微复杂一点的例子是比较两个可为空的对象属性:

以这种方式使用扩展有什么陷阱?其他编码员可能会感到困惑吗?这只是滥用扩展名吗?


我想我在这里真正想要的是编译器/语言扩展:

这将使复杂的情况变得容易得多:

这仅适用于值类型,但您可以返回可为空的等价物:

0 投票
6 回答
1348 浏览

c# - 有没有办法在 C# 的对象初始化程序块中使用扩展方法

下面的简单演示捕获了我正在尝试做的事情。在实际程序中,我必须使用对象初始化程序块,因为它正在读取 LINQ to SQL 选择表达式中的列表,并且有一个值我想从数据库中读取并存储在对象上,但是对象没有我可以为该值设置的简单属性。相反,它有一个 XML 数据存储。

看起来我无法在对象初始化程序块中调用扩展方法,也无法使用扩展方法附加属性。

那么我对这种方法不走运吗?唯一的选择似乎是说服基类的所有者针对这种情况对其进行修改。

我有一个现有的解决方案,其中我将 BaseDataObject 子类化,但这也存在在这个简单示例中没有出现的问题。对象作为 BaseDataObject 持久化和恢复 - 强制转换和测试会变得复杂。

答案之一(来自 mattlant)建议使用流畅的界面样式扩展方法。例如:

但这会在 LINQ 查询中工作吗?