问题标签 [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.
apache-flex - 是否可以在不继承类的情况下向非动态 ActionScript 3 类添加行为?
我想做的是如下所示:
也就是说,我想用一个方法来扩展一个生成的类,而不是通过继承,而是通过原型。
该类是从 WSDL 生成的,它不是动态类,我不想接触生成的代码,因为无论如何它都会被覆盖。
长话短说,我希望在道德上等同于 C# 3:s 的 AS3 扩展方法。
编辑:我接受了 aib 的回答,因为它最符合我的要求——尽管经过进一步思考,它并不能真正解决我的问题,但这是我提出错误问题的错。:) 另外,upmods 的好建议。
c# - 扩展接口模式
.Net 3.5 中的新扩展允许功能从接口中分离出来。
例如在 .Net 2.0
可以(在 3.5 中)变为:
在我看来,这对于许多接口来说是一种更好的机制。他们不再需要一个抽象的基础来共享此代码,并且在功能上代码的工作方式相同。这可以使代码更易于维护和测试。
唯一的缺点是抽象基实现可以是虚拟的,但可以解决这个问题(实例方法会隐藏同名的扩展方法吗?这样做会混淆代码吗?)
还有其他不经常使用这种模式的理由吗?
澄清:
是的,我看到扩展方法的趋势是到处都有它们。在没有大量同行评审的情况下,我会特别小心地使用任何.Net 值类型(我认为我们在字符串上唯一的一个是.SplitToDictionary()
- 类似于.Split()
但也采用键值分隔符)
我认为那里有一个完整的最佳实践辩论;-)
(顺便说一句:DannySmurf,你的 PM 听起来很吓人。)
我在这里特别询问在以前我们有接口方法的地方使用扩展方法。
我试图避免很多层次的抽象基类——实现这些模型的类大多已经有了基类。我认为与添加更多对象层次结构相比,该模型更易于维护且耦合更少。
这是 MS 对 Linq 的 IEnumerable 和 IQueryable 所做的吗?
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?
c# - 扩展方法不适用于接口
受 MVC 店面启发,我正在进行的最新项目是在 IQueryable 上使用扩展方法来过滤结果。
我有这个界面;
我有这个扩展方法
假设我有一个类 SimpleObj,它实现了 IPrimaryKey。当我有一个 SimpleObj 的 IQueryable 时,GetByID 方法不存在,除非我明确地将其转换为 IPrimaryKey 的 IQueryable,这不太理想。
我在这里错过了什么吗?
c# - 组织扩展方法
你如何组织你的扩展方法?假设我有对象类和字符串类的扩展,我很想将这些扩展方法分成 IE 类:
我是让这太复杂还是有意义?
c# - 为什么 IEnumerable 上没有 ForEach 扩展方法?
受到另一个询问缺失Zip
功能的问题的启发:
为什么界面上没有ForEach
扩展方法?IEnumerable
还是在任何地方?唯一获得ForEach
方法的类是List<>
. 是否有它丢失的原因,也许是性能?
c# - 使用这种(基于扩展方法的)速记的可能陷阱
C#6 更新
下面的问题仍然适用于旧版本,但如果使用 new 运算符开发新应用程序?.
是更好的做法。
原始问题:
我经常想访问可能为空的对象的属性:
等等...
我经常使用它,所以我有一个片段。
在以下情况下,您可以使用内联在某种程度上缩短它:
但是,这有点笨拙,尤其是在设置大量属性或多个级别可以为空的情况下,例如:
我真正想要的是??
样式语法,它适用于直接为空的类型:
所以我想出了以下内容:
这让我可以使用这种语法:
这简化了这些调用,但我不确定是否要检查这种扩展方法 - 它确实使代码更易于阅读,但以扩展对象为代价。这会出现在所有东西上,尽管我可以将它放在一个专门引用的命名空间中。
这个例子是一个相当简单的例子,一个稍微复杂一点的例子是比较两个可为空的对象属性:
以这种方式使用扩展有什么陷阱?其他编码员可能会感到困惑吗?这只是滥用扩展名吗?
我想我在这里真正想要的是编译器/语言扩展:
这将使复杂的情况变得容易得多:
这仅适用于值类型,但您可以返回可为空的等价物:
c# - 有没有办法在 C# 的对象初始化程序块中使用扩展方法
下面的简单演示捕获了我正在尝试做的事情。在实际程序中,我必须使用对象初始化程序块,因为它正在读取 LINQ to SQL 选择表达式中的列表,并且有一个值我想从数据库中读取并存储在对象上,但是对象没有我可以为该值设置的简单属性。相反,它有一个 XML 数据存储。
看起来我无法在对象初始化程序块中调用扩展方法,也无法使用扩展方法附加属性。
那么我对这种方法不走运吗?唯一的选择似乎是说服基类的所有者针对这种情况对其进行修改。
我有一个现有的解决方案,其中我将 BaseDataObject 子类化,但这也存在在这个简单示例中没有出现的问题。对象作为 BaseDataObject 持久化和恢复 - 强制转换和测试会变得复杂。
答案之一(来自 mattlant)建议使用流畅的界面样式扩展方法。例如:
但这会在 LINQ 查询中工作吗?