Questions tagged «extension-methods»

扩展方法是某些语言的语言功能,例如Swift,Visual Basic.NET和C#。扩展方法使您可以将方法“添加”到现有类型,而无需创建新的派生类型,重新编译或修改原始类型。

16
将字符串转换为可为null的类型(int,double等)
我正在尝试进行一些数据转换。不幸的是,许多数据都是字符串形式,应该是int或double等等。 所以我得到的是这样的: double? amount = Convert.ToDouble(strAmount); 这种方法的问题是,如果strAmount为空,如果为strAmount为空,则我希望它等于null,因此当我将其添加到数据库中时,该列将为null。所以我最终写了这个: double? amount = null; if(strAmount.Trim().Length>0) { amount = Convert.ToDouble(strAmount); } 现在可以正常工作,但是我现在有五行代码而不是一行。这使事情更加难以阅读,尤其是当我有大量要转换的列时。 我以为我会使用字符串类和泛型的扩展名来传递类型,这是因为它可以是double或int或long。所以我尝试了这个: public static class GenericExtension { public static Nullable<T> ConvertToNullable<T>(this string s, T type) where T: struct { if (s.Trim().Length > 0) { return (Nullable<T>)s; } return null; } } 但是我得到了错误:无法将类型'string'转换为'T?' 有没有解决的办法?我对使用泛型创建方法不是很熟悉。

13
我可以“乘以”一个字符串(在C#中)吗?
假设我有一个字符串,例如 string snip = "</li></ul>"; 我想基本上将它多次写入,具体取决于某个整数值。 string snip = "</li></ul>"; int multiplier = 2; // TODO: magic code to do this // snip * multiplier = "</li></ul></li></ul>"; 编辑:我知道我可以很容易地编写自己的函数来实现这一点,我只是想知道是否有一些我不知道的奇怪的字符串运算符

2
如何在Go中向现有类型添加新方法?
我想在gorilla/muxRoute和Router类型上添加一个便捷的util方法: package util import( "net/http" "github.com/0xor1/gorillaseed/src/server/lib/mux" ) func (r *mux.Route) Subroute(tpl string, h http.Handler) *mux.Route{ return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) } func (r *mux.Router) Subroute(tpl string, h http.Handler) *mux.Route{ return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) } 但是编译器告诉我 无法在非本地类型mux.Router上定义新方法 那么我将如何实现呢?是否创建具有匿名mux.Route和mux.Router字段的新结构类型?或者是其他东西?

1
扩展方法可以应用于接口吗?
是否可以将扩展方法应用于接口?(C#问题) 例如,这可以实现以下目的: 创建一个ITopology接口 为此接口创建扩展方法(例如,公共静态int CountNodes(此ITopology topologyIf)) 然后在创建实现ITopology的类(例如MyGraph)时,它将自动具有Count Nodes扩展。 这样,实现接口的类不必具有设置的类名即可与扩展方法中定义的名称保持一致。

8
将范围添加到集合
一位同事今天问我如何将范围添加到集合中。他有一个继承自的类Collection<T>。有一个该类型的get-only属性,其中已经包含一些项目。他想将另一个集合中的项目添加到属性集合中。他如何以C#3友好的方式这样做?(请注意有关“仅获取”属性的约束,该约束会阻止执行Union和重新分配之类的解决方案。) 当然,与财产有关。添加将起作用。但是,List<T>风格的AddRange会更加优雅。 编写扩展方法很容易: public static class CollectionHelpers { public static void AddRange<T>(this ICollection<T> destination, IEnumerable<T> source) { foreach (T item in source) { destination.Add(item); } } } 但是我有种自己在重新发明轮子的感觉。我没有发现任何类似的System.Linq或morelinq。 设计不好?只需致电添加?缺少明显之处?

9
如何使用c#扩展方法扩展类?
扩展方法可以应用于该类吗? 例如,将DateTime扩展为包括一个Tomorrow()方法,该方法可以像下面这样调用: DateTime.Tomorrow(); 我知道我可以用 static DateTime Tomorrow(this Datetime value) { //... } 要么 public static MyClass { public static Tomorrow() { //... } } 得到类似的结果,但是如何扩展DateTime以便调用DateTime.Tomorrow?

4
C#中有什么方法可以用扩展方法覆盖类方法?
有时候我想用扩展方法覆盖类中的方法。在C#中有什么方法可以做到这一点? 例如: public static class StringExtension { public static int GetHashCode(this string inStr) { return MyHash(inStr); } } 我想要这样做的一种情况是能够将字符串的哈希存储到数据库中,并且使用该字符串类的哈希的所有类(例如Dictionary等)都使用相同的值。内置的.Net哈希算法不能保证从Framework的一个版本到下一个版本都兼容,我想用自己的版本替换它。 在其他情况下,我也想用扩展方法覆盖类方法,因此它不仅特定于字符串类或GetHashCode方法。 我知道我可以通过将现有类继承为子类来做到这一点,但是在很多情况下,能够通过扩展来做到这一点很方便。

5
如何使用Active Support核心扩展
我已经安装了Active Support 3.0.3,并且已将Rails 3.0.3与Ruby 1.8.7一起安装。 当我尝试使用时,1.week.ago我得到 NoMethodError: undefined method 'week' for 1:Fixnum from (irb):2 其他核心扩展似乎也有效。我在朋友的计算机上尝试过(相同的安装规格和旧版本),结果相同。 是什么赋予了? 所有这些都在IRB中。

2
“折叠” LINQ扩展方法在哪里?
我在MSDN的Linq样本中发现了一个我想使用的名为Fold()的整洁方法。他们的例子: double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 }; double product = doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor); 不幸的是,无论是在示例中还是在我自己的代码中,我都无法对此进行编译,并且在MSDN中找不到其他提及此方法的地方(例如Enumerable或Array扩展方法)。我得到的错误是一个普通的旧“不知道该错误”错误: error CS1061: 'System.Array' does not contain a definition for 'Fold' and no extension method 'Fold' accepting a first argument of type 'System.Array' could be found (are you missing a …


5
如何扩展C#内置类型(如String)?
问候大家...我需要Trim一个String。但是我想删除String本身中所有重复的空格,而不仅是在字符串的结尾或开头。我可以用类似的方法做到这一点: public static string ConvertWhitespacesToSingleSpaces(string value) { value = Regex.Replace(value, @"\s+", " "); } 我从这里得到的。但是我希望这段代码String.Trim()本身可以被调用,所以我认为我需要扩展或重载或重写该Trim方法。有没有办法做到这一点? 提前致谢。

6
如何使用Moq模拟扩展方法?
我正在编写一个依赖于扩展方法结果的测试,但是我不希望该扩展方法的将来失败会破坏该测试。模拟该结果似乎是显而易见的选择,但是Moq似乎没有提供重写静态方法(扩展方法的要求)的方法。Moq.Protected和Moq.Stub也有类似的想法,但是在这种情况下他们似乎没有提供任何帮助。我是否缺少某些东西,还是应该以其他方式处理? 这是一个简单的示例,但失败了,并出现了常见的“对不可覆盖成员的无效期望”。这是一个需要模拟扩展方法的糟糕示例,但应该这样做。 public class SomeType { int Id { get; set; } } var ListMock = new Mock<List<SomeType>>(); ListMock.Expect(l => l.FirstOrDefault(st => st.Id == 5)) .Returns(new SomeType { Id = 5 }); 至于可能建议我使用隔离器的所有TypeMock迷:我很感谢所做的努力,因为看起来TypeMock可以蒙住眼睛和使人兴奋,但我们的预算不会很快增加。

30
您发现扩展方法的哪些优势?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案能得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 C#的“非信奉者”在问我扩展方法的目的是什么。我解释说,然后您可以向已定义的对象添加新方法,尤其是当您不拥有/控制原始对象的源时。 他提出了“为什么不只是向自己的班级添加方法呢?” 我们一直在(很好的方式)走来走去。我的一般回答是它是工具带中的另一个工具,而他的回答是这是对工具的无用浪费……但是我认为我会得到一个更“开明”的答案。 在哪些情况下使用了扩展方法而又没有(或不应该)使用扩展方法添加到自己的类中?

2
如何用JavaScript编写扩展方法?
我需要在JS中编写一些扩展方法。我知道如何在C#中做到这一点。例: public static string SayHi(this Object name) { return "Hi " + name + "!"; } 然后由以下人员调用: string firstName = "Bob"; string hi = firstName.SayHi(); 我将如何在JavaScript中执行类似的操作?

8
Swift扩展示例
我原本想知道如何做这样的事情 UIColor.myCustomGreen 这样我就可以定义自己的颜色并在整个应用程序中使用它们。 我之前研究过扩展,我认为我可以使用它们来解决问题,但是我不记得确切地如何设置扩展。在撰写本文时,在Google上搜索“ Swift扩展程序”导致了文档,一些冗长的教程以及一个相当无益的Stack Overflow问题。 因此答案是存在的,但是需要对文档和教程进行一些挖掘。我决定写这个问题和以下答案,以便为Stack Overflow添加一些更好的搜索关键字,并提供有关扩展程序设置方式的快速入门。 我特别想知道: 扩展驻留在哪里(文件和命名约定)? 扩展语法是什么? 有哪些简单的常用示例?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.