我有一些使用扩展方法的代码,但使用VS2008中的编译器在.NET 2.0下编译。 为了方便这个,我不得不声明ExtensionAttribute: /// <summary> /// ExtensionAttribute is required to define extension methods under .NET 2.0 /// </summary> public sealed class ExtensionAttribute : Attribute { } 但是,现在我想要包含该类的库也可以在.NET 3.0,3.5和4.0下编译 – 没有“ExtensionAttribute在多个地方定义”的警告。 有什么编译时间指令我可以用来只包括ExtensionAttribute当框架版本的目标是.NET 2?
我收到错误: 扩展方法必须在非generics静态类中定义 在线上: public class LinqHelper 这是基于Mark Gavells代码的助手类。 我真的很困惑这个错误是什么意思,因为我确信当我在星期五离开时它工作的很好! using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Linq.Expressions; using System.Reflection; /// <summary> /// Helper methods for link /// </summary> public class LinqHelper { public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "OrderBy"); } public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string […]
我有一个stringforms的整数数组: var arr = new string[] { "1", "2", "3", "4" }; 我需要一个“真正的”整数数组来推动它: void Foo(int[] arr) { .. } 我试图投入int,它当然是失败的: Foo(arr.Cast<int>.ToArray()); 我可以做下一个: var list = new List<int>(arr.Length); arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better? Foo(list.ToArray()); 要么 var list = new List<int>(arr.Length); arr.ForEach(i => { int j; if (Int32.TryParse(i, out j)) // TryParse is faster, […]
我正在编写一个testing,这个testing取决于扩展方法的结果,但是我不希望这个扩展方法的未来失败破坏这个testing。 嘲笑这个结果似乎是一个明显的select,但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 }); 至于任何可能build议我使用隔离器的TypeMock瘾君子:我很欣赏这样的努力,因为它看起来像TypeMock可以做蒙住眼睛和醉酒的工作,但我们的预算不会很快增加。
在C#中有一种使用reflection技术来确定一个方法是否已经作为扩展方法添加到类中? 给定一个如下所示的扩展方法是否可以确定Reverse()已经添加到string类? public static class StringExtensions { public static string Reverse(this string value) { char[] cArray = value.ToCharArray(); Array.Reverse(cArray); return new string(cArray); } } 我们正在寻找一种机制,在unit testing中确定扩展方法是由开发人员适当添加的。 这样做的一个原因是开发人员可能会将类似的方法添加到实际的类中,如果是的话,编译器会select该方法。
C#有扩展属性吗? 例如,我可以添加一个扩展属性DateTimeFormatInfo称为ShortDateLongTimeFormat将返回ShortDatePattern + " " + LongTimePattern ?
我是C#中扩展方法的粉丝,但没有成功添加扩展方法到静态类,如控制台。 例如,如果我想向控制台添加一个名为“WriteBlueLine”的扩展,那么我可以这样做: Console.WriteBlueLine("This text is blue"); 我试图通过添加一个本地的公共静态方法,作为一个“这个”参数的控制台…但没有骰子! public static class Helpers { public static void WriteBlueLine(this Console c, string text) { Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine(text); Console.ResetColor(); } } 这没有添加一个'WriteBlueLine'方法到控制台…我做错了吗? 或者要求不可能的?
对,所以我有一个枚举,并希望从它得到不同的价值。 使用System.Linq ,当然有一个名为Distinct的扩展方法。 在简单情况下,它可以使用没有参数,如: var distinctValues = myStringList.Distinct(); 那么好,但如果我有我需要指定相等的对象的枚举,唯一可用的重载是: var distinctValues = myCustomerList.Distinct(someEqualityComparer); 相等比较器参数必须是IEqualityComparer<T>一个实例。 当然,我可以做到这一点,但是有点冗长,而且很有趣。 我所期望的是一个需要lambda的重载,比如Func <T,T,bool>: var distinctValues = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId); 任何人都知道,如果这样的扩展存在,或一些等效的解决方法? 还是我错过了什么? 另外,有没有一种方法来指定一个IEqualityComparer内联(不容我)? 更新 我发现Anders Hejlsberg在MSDN论坛上发布了一个关于这个主题的post。 他说: 你将遇到的问题是,当两个对象比较相等时,它们必须具有相同的GetHashCode返回值(否则Distinct内部使用的哈希表将无法正常工作)。 我们使用IEqualityComparer,因为它将Equals和GetHashCode的兼容实现打包到一个接口中。 我想这是有道理的..
在System.Linq命名空间中,我们现在可以扩展IEnumerable的Any()和Count() 扩展方法 。 我最近被告知,如果我想检查一个集合包含1个或多个项目,我应该使用.Count() > 0扩展方法,而不是.Count() > 0扩展方法,因为.Count()扩展方法必须遍历所有的项目。 其次,一些集合有一个属性 (不是扩展方法),即Count或Length 。 使用这些,而不是.Count()或.Count()会更好吗? 是/娜?
让我们列出你发布你的优秀和最喜欢的扩展方法的答案。 要求是必须发布完整的代码,以及如何使用它的例子和解释。 基于对这个主题的高度兴趣,我已经在Codeplex上设置了一个名为extensionoverflow的开源项目。 请将您的答案标记为Codeplex项目中的代码。 请发布完整的源代码,而不是链接。 Codeplex新闻: 24.08.2010 Codeplex页面现在位于: http ://extensionoverflow.codeplex.com/ 2008年11月11日XmlSerialize / XmlDeserialize现在已经实现并被unit testing 。 11.11.2008还有更多开发者的空间。 😉 立即join! 11.11.2008第三名贡献者join了ExtensionOverflow ,欢迎来到BKristensen 11.11.2008 FormatWith现在已经实现,并进行了unit testing 。 09.11.2008第二个贡献者join了ExtensionOverflow 。 欢迎来到chakrit 。 09.11.2008我们需要更多的开发者。 😉 09.11.2008 ThrowIfArgumentIsNull现已在Codeplex上实现并进行了unit testing 。