你最喜欢的自定义扩展方法是什么?

8 浏览
0 Comments

你最喜欢的自定义扩展方法是什么?

让我们列出一个答案清单,您可以在其中发布您优秀且喜爱的扩展方法。要求是必须发布完整的代码,并提供一个示例和如何使用该方法的解释。鉴于这个话题的高度兴趣,我在Codeplex上建立了一个名为extensionoverflow的开源项目。请标记您的答案以接受将代码放入Codeplex项目中。请发布完整的源代码,而不是链接。Codeplex新闻: 24.08.2010 Codeplex页面现在在这里:http://extensionoverflow.codeplex.com/ 11.11.2008 XmlSerialize / XmlDeserialize 现在已实现并通过了单元测试。 11.11.2008 还有更多开发者的空间。;-) 现在加入! 11.11.2008 第三位贡献者加入ExtensionOverflow,欢迎BKristensen。 11.11.2008 FormatWith 现在已实现并通过了单元测试。 09.11.2008 第二位贡献者加入ExtensionOverflow,欢迎chakrit。 09.11.2008 我们需要更多开发者。;-) 09.11.2008 ThrowIfArgumentIsNull 现在已在Codeplex上实现并通过了单元测试。

0
0 Comments

问题的出现原因:对于一些常用的操作,我们希望能够通过简单的方式实现,而不需要每次都写一大段代码。例如,我们希望能够通过简单的方式实现字符串的格式化输出,而不需要每次都写string.Format方法。

解决方法:我们可以通过自定义扩展方法来实现这个功能。通过定义一个静态类StringExtensions,并在其中定义一个扩展方法F,我们可以将格式化字符串的操作简化为"some string".F("param")的形式。

这样的实现不仅可以提高代码的可读性,还可以减少代码的冗余。对于团队中的新成员来说,虽然刚开始可能需要一些时间来适应这种写法,但是一旦熟悉了这种写法,就可以更加高效地进行代码编写。

在这个例子中,还提到了一些对于方法命名的建议,如FormatBy、FormatWith等。这些命名方式可以根据个人的喜好进行选择。

同时,也有一些人提出了一些改进的意见,如添加一些重载方法、使用特定的CultureInfo等。这些改进可以根据实际需求进行考虑。

自定义扩展方法可以提高代码的可读性和简洁性,使代码更加易于维护和理解。对于常用的操作,可以通过自定义扩展方法来简化代码的编写,提高开发效率。

0
0 Comments

原因:文章中提到了的一些自定义扩展方法,包括日期和时间处理、范围和步长处理、比较、参数检查、LINQ to XML应用等。这些自定义扩展方法可能是在项目中常用的一些方法,因此引发了问题"What are your favorite custom extension methods?"。

解决方法:文章中并未给出问题"What are your favorite custom extension methods?"的解决方法,因为这个问题本身并不需要解决,只是询问的喜爱的自定义扩展方法。

以下是根据文章内容整理的一篇文章:

我在我的MiscUtil项目中有各种自定义扩展方法(完整源代码可在此处查看 - 我不会在这里重复)。我最喜欢的一些方法,其中一些涉及其他类(比如范围):

日期和时间处理 - 主要用于单元测试。不确定在生产环境中是否会使用它们 🙂

var birthday = 19.June(1976);
var workingDay = 7.Hours() + 30.Minutes();

范围和步长处理 - 非常感谢Marc Gravell为此提供的操作符相关内容

var evenNaturals = 2.To(int.MaxValue).Step(2);
var daysSinceBirth = birthday.To(DateTime.Today).Step(1.Days());

比较:

var myComparer = ProjectionComparer.Create(Person p => p.Name);
var next = myComparer.ThenBy(p => p.Age);
var reversed = myComparer.Reverse();

参数检查:

x.ThrowIfNull("x");

应用于匿名类型(或具有适当属性的其他类型)的LINQ to XML:

// <Name>Jon</Name><Age>32</Age>
new { Name="Jon", Age=32}.ToXElements();
// Name="Jon" Age="32" (as XAttributes, obviously)
new { Name="Jon", Age=32}.ToXAttributes()

Push LINQ - 在这里解释会花太长时间,但可以搜索一下。

真不错!你应该把它放在Google Code或CodePlex上,这样我就可以给你发送一些补丁了 🙂 我保证它会很易读 😛

是的,我会把它移到Google Code上...并在同一时间重命名它,很可能!(MiscUtil是一个糟糕的名字。)

:你已经可以看到代码了。点击第一句中的链接-完整的源代码就在那里。

Skeet。我可以使用该代码并将其放入Codeplex项目中吗?

:我宁愿自己做,放在code.google.com上并自己管理项目,如果你不介意的话。显然,只要保留适当的归属,你可以将其放在Codeplex上,但我宁愿自己很快解决这个问题,除非你迫切需要 🙂

Skeet。它是根据MIT许可证免费使用的,无论是商业还是开源。为什么不合力,为公众创建一个扩展方法库。

只因为我在那个库中做了很多其他的东西。你可以为你的项目获取所有内容的副本,但我宁愿也保留一个副本在我的项目中。

x.ThrowIfNull对我来说似乎是错的。你在调用一个看起来是实例成员的方法来检查它是否为null。我知道这样做是可以的,因为扩展方法只是静态方法,但这并不直观。

:一开始确实不直观,但一旦你习惯了(这真的不需要很长时间),它就简洁而易读。保持你对新方法的开放态度 🙂

Jon,你的网站上说这是“根据Apache许可证许可...”。哪个许可证是正确的:MIT/Apache?谢谢

19.June(1976)是可以的(至少在测试中),但我不喜欢30.Minutes()。为什么不使用运算符重载来达到更接近科学记数法的效果,比如30 * min30 * Minutes如果你喜欢的话。

:嗯,无论哪种情况,你都必须在每个使用它们的源文件中定义minMinutes... 这可能会变得很烦人。使用扩展方法只需要添加using指令(我们通常不看它们)。但这绝对是个人品味的问题。

啊,好主意 ;)当然可以将其设置为静态的,这样你就可以做一些像30 * SI.min这样的事情,但这只会使它变得不太清晰。

0
0 Comments

问题的出现原因是在代码中存在多个重复的判断条件,导致代码冗长且不易读。解决方法是使用自定义的扩展方法来简化代码。

扩展方法的定义如下:

public static bool In(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

使用扩展方法可以将原来冗长的判断条件替换为简洁的代码:

if(reallyLongIntegerVariableName.In(1,6,9,11))
{
      // do something....
}
if(reallyLongStringVariableName.In("string1","string2","string3"))
{
      // do something....
}
if(reallyLongMethodParameterName.In(SomeEnum.Value1, SomeEnum.Value2, SomeEnum.Value3, SomeEnum.Value4)
{
  // do something....
}

有人对扩展方法的命名提出了不同的意见,建议使用更具描述性的方法名。另外,该代码需要依赖于System.Linq命名空间,确保引入了正确的命名空间或程序集引用。还某些情况下扩展方法需要至少一个参数的问题,建议使用LINQ的Contains方法来解决。也有人建议编写两个扩展方法IsInOne()和IsInAll()。

总体而言,扩展方法In(...)是一种非常有用的自定义扩展方法,可以简化代码并提高可读性。尽管对于方法名有不同的意见,但该方法在实际使用中被证明非常实用。

0