Tag: 扩展方法

在C#3.0中是否存在针对“特殊类”Enum的generics类型约束的解决方法?

更新:有关C#解决方法,请参阅此问题的底部。 嗨,您好, 请考虑以下扩展方法: public static bool HasFlags(this T value, T flags) where T : System.Enum { // … } 如您所知,这将在编译时抛出错误,因为通常不允许类从System.Enuminheritance。 问题是使用enum关键字指定的任何枚举实际上都是从System.Enuminheritance的,因此上述代码将是仅将扩展方法限制为枚举的理想方法。 现在明显的解决方法是使用Enum而不是T ,但是你失去了generics类型的好处: MyEnum e; e.HasFlags(MyOtherEnum.DoFunkyStuff); 上面的代码会使用generics类型抛出编译时错误,而它只能使用Enum类型抛出运行时错误(如果我实现它就会这样做。) 是否有任何编译器选项可用于关闭约束检查,还是有其他一些漂亮的方法来做到这一点? 在建议之前,我想说我不会where T : struct或者其他where T : struct使用,从那以后你就可以做到像123.HasFlags(456)这样奇怪的东西。 我很困惑为什么这个错误根本存在…这是你where T : System.Object使用的同样的问题,但为此你有where T : class …为什么没有where T : enum ? C#解决方法 Jon Skeet已经开始研究一个库,该库通过对IEnumConstraint的约束来编译类,然后将其替换为System.Enum后构建。 我相信,这是目前最接近解决这个问题的人。 看到: 代码项目: http : […]

C#2.0中的扩展方法

我需要什么命名空间才能使我的扩展工作 这是我的扩展方法 使用系统; 使用System.Collections.Generic; 使用System.Web; 使用System.Data; 命名空间MyUtilities { public static class DataReaderExtensions { public static DataTable ToDataTable(IDataReader reader) { DataTable table = new DataTable(); table.Load(读取器); 返回表; } } } 当我尝试像这样使用它 Session [“Master”] = cust.GetCustomerOrderSummary((string)Session [“CustomerNumber”])。ToDataTable(); 它不起作用。 这是.net 2.0

扩展String类与IsNullOrEmpty混淆?

每个人都知道并喜欢String.IsNullOrEmpty(yourString)方法。 我想知道如果我们将String类扩展为具有这样的方法,是否会混淆开发人员或使代码更好: yourString.IsNullOrEmpty(); 优点: 更具可读性。 减少打字。 缺点: 可能会令人困惑,因为yourString变量可以为null ,看起来你正在对null变量执行方法。 你怎么看? 我们可以询问有关myObject.IsNull()方法的相同问题。 那怎么写我: public static class StringExt { public static bool IsNullOrEmpty(this string text) { return string.IsNullOrEmpty(text); } public static bool IsNull(this object obj) { return obj == null; } }

为什么在通用静态类中声明扩展方法是不可能的?

我想为一些generics类创建很多扩展方法,例如for public class SimpleLinkedList where T:IComparable 我已经开始创建这样的方法: public static class LinkedListExtensions { public static T[] ToArray(this SimpleLinkedList simpleLinkedList) where T:IComparable { //// code } } 但是当我试图使LinkedListExtensions类像这样通用时: public static class LinkedListExtensions where T:IComparable { public static T[] ToArray(this SimpleLinkedList simpleLinkedList) { ////code } } 我得到“扩展方法只能在非generics,非嵌套的静态类中声明”。 而我正在试图猜测这种限制来自哪里并且没有任何想法。 编辑:仍然没有明确的问题愿景。 似乎这只是因为某种原因没有实现。

如何在JOIN扩展方法中实现左连接

我试图在p.Person表的这种查询上实现外连接。 我该怎么办? 此示例来自http://ashishware.com/DSLinqExample.shtml var onlyinfo = p.Person .Where(n => n.FirstName.Contains(‘a’)) .Join(p.PersonInfo, n => n.PersonId, m => m.PersonId, (n, m) => m) .ToArray();

List 的Last()扩展方法的性能如何?

我真的很喜欢Last()并且会一直使用List 。 但由于它似乎是为IEnumerable定义的,我想它首先枚举枚举 – 这应该是O(n)而不是O(1)直接索引List的最后一个元素。 标准(Linq)扩展方法是否意识到这一点? C ++中的STL通过迭代器和诸如此类的整个“inheritance树”来意识到这一点。

为什么我不能从扩展类型的基类调用扩展方法?

我正在尝试通过覆盖索引器来添加查找List<KeyValuePair>的元素的function。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { public class MyList : List<KeyValuePair> { public int this[string key] { get { return base.Single(item => item.Key == key).Value; } } } } 由于某种原因,编译器抛出此错误: ‘ System.Collections.Generic.List<System.Collections.Generic.KeyValuePair> ‘不包含’ Single ‘的定义。 虽然List确实没有该方法,但它应该是可见的,因为它是System.Linq命名空间(包含在内)中的扩展方法。 显然使用this.Single解决了这个问题,但为什么通过base访问是一个错误? C#规范第7.6.8节说 当base.I出现在类或结构中时, I必须表示该类或结构的基类的成员。 这似乎阻止了通过base访问扩展方法。 不过它也说 在绑定时, base.I和base[E]forms的基本访问表达式的计算方式与它们的编写完全相同((B)this).I和((B)this)[E] ,其中B是构造发生的类或结构的基类。 因此, base.I和base[E]对应于this.I和this[E] […]

在C#中调用方法时的预热

我刚看到这篇关于时间测量的post 。 我记得(我希望我没有记错)这是一场不公平的比赛,如果以前从未打过这种方法的话。 那是: // At the beginning of the application MyClass instance = new MyClass(); instance.MyMethod(); instance.MyMethod(); // Faster than the first call, because now it’s warmed up. 我们真的在C#中有这样的热身理论吗? 如果是,为什么(热身时CLR会做什么)? 如果这个方法是扩展方法(静态方法),那么一切都是一样的吗?

如何获得更改原始对象的扩展方法?

我希望能够编写扩展方法,以便我可以说: lines.ForceSpaceGroupsToBeTabs(); 代替: lines = lines.ForceSpaceGroupsToBeTabs(); 但是,以下代码目前输出: ….one ……..two 代替: Tone TTtwo 我需要在以下代码中更改以使其输出: Tone TTtwo (请注意,对于可见性, . = space, T = \t ): using System; using System.Collections.Generic; namespace TestExtended82343 { class Program { static void Main(string[] args) { List lines = new List(); lines.Add(“….one”); lines.Add(“……..two”); lines.ForceSpaceGroupsToBeTabs(); lines.ForEach(l => Console.WriteLine(l)); Console.ReadLine(); } } public static class […]

解决扩展方法/ LINQ歧义

我正在为ReSharper 4编写一个加载项。为此,我需要引用几个ReSharper的程序集。 其中一个程序集(JetBrains.Platform.ReSharper.Util.dll)包含System.Linq命名空间,其中包含System.Core已提供的扩展方法的子集。 当我编辑代码时,它会在这些扩展之间产生歧义,因此我不能使用OrderBy 。 我该怎么解决这个问题? 我想使用核心LINQ扩展,而不是ReSharper的扩展。 尝试编译时出现以下错误: 以下方法或属性之间的调用不明确:’ System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable , System.Func)’ and ‘System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable, System.Func )’ 编辑:我尝试了下面的建议,遗憾的是没有运气。 同时,我通过删除对System.Core引用来“解决”问题。 这样我就可以使用ReSharper DLL文件提供的扩展。 我上传了一个示例程序 ,我刚刚导入了我需要的ReSharper DLL文件。 我将System.Core的别名更改为SystemCore ,添加了extern alias指令,但它仍然无法正常工作。 如果我错过了什么,请告诉我。 PS参考是安装在”C:\Program Files\JetBrains\ReSharper\v4.1\…”默认directroy中的ReSharper v4.1 DLL文件。