Tag: 扩展方法

在C#中使用Maybe monad和扩展方法?

编辑2015这个问题和它的答案不再相关。 在C#6出现之前,有一个空传播运算符(?)被提出来,它避免了在这个问题和随后的答案中讨论的hacky-workarounds。 截至2015年,在C#中,您现在应该使用Form.ActiveForm?.ActiveControl?.Name。 我一直在思考在.NET中的空传播问题,这往往导致丑陋,重复的代码,如下所示: 尝试#1通常的代码: string activeControlName = null; var activeForm = Form.ActiveForm; if (activeForm != null) { var activeControl = activeForm.ActiveControl; if(activeControl != null) { activeControlname = activeControl.Name; } } 关于一个Maybe <T> monad,或者使用某种“if not null”扩展方法,已经在StackOverflow上进行了一些讨论: 尝试#2,扩展方法: // Usage: var activeControlName = Form.ActiveForm .IfNotNull(form => form.ActiveControl) .IfNotNull(control => control.Name); // Definition: public static TReturn IfNotNull<TReturn, […]

C#扩展方法作为接口实现

我想知道是否某个类的C#扩展方法可以作为接口的实现吗? 我有什么: 一个iterface: public interface IEventHandler { void Notify(SEvent ev, IEventEmmiter source); } 一个实现它的类: class Sim : IEventHandler { /*public void Notify(SEvent ev, IEventEmmiter source) { Console.WriteLine("Got notified: " + ev.Name); }*/ } 而一个包含扩展方法的类: public static class ReflectiveEventDispatcher { public static void Notify(this IEventHandler handler, SEvent ev) { if (handler.GetType().GetMethod("Handle" + ev.Name) != null) { […]

扩展方法与inheritance

有什么经验法则可以帮助确定在哪种情况下使用哪种? 我应该比其他大多数时间更喜欢一个吗? 谢谢!

最佳实践:C#扩展方法命名空间和推广扩展方法

我知道已经有一个post ,描述几乎相同,但我认为我有点不同。 我想知道的是如何组织你的扩展方法分配命名空间。 目前 – 对于我们框架中的扩展方法 – 我使用下面的命名空间模式 MyCompany.Web.Utils 里面我有扩展方法类。 这对我来说很好,因为我们的软件开发人员不能立即看到扩展程序。 考虑一下我有一个StringExtender类,它提供了一个扩展 String对象的非常方便的扩展方法“In” 。 有了上面提到的命名空间的扩展方法,我们的程序员将不会看到扩展方法,除非它们明确包含它的命名空间。 相反,如果我将扩展方法放在System命名空间中,所有人都会马上看到它,但是我已经读过这是不好的做法 。 所以我的问题是如何促进你的开发人员使用它们的扩展方法。

什么是扩展方法?

.NET中的扩展方法是什么? 编辑:我已经发布了后续使用扩展方法的问题

从扩展方法的ArgumentNullException或NullReferenceException?

如果在空实例上调用扩展方法(扩展方法不允许),那么你认为什么是最好的exceptiontypes? 由于扩展方法不过是静态方法,所以可以说它应该是ArgumentNullException,但是另一方面它们被用作实例方法,因此使用NullReferenceException可能更自然。 我们来看下面的例子: public static string ToInvariantString(this IFormattable value, string format) { return value.ToString(format, CultureInfo.InvariantCulture); } 这样,如果value参数为null,则会抛出NullReferenceExceptionexception。 另一个例子是: public static string ToInvariantString(this IFormattable value, string format) { if (value == null) throw new ArgumentNullException("value"); return value.ToString(format, CultureInfo.InvariantCulture); } 编辑:在一些答案,你已经指出,扩展方法可以被称为像一个静态方法,在这种情况下,空引用exception将是错误的,这是一个伟大的观点,实际上我的一个担心,不知道为什么我忘了在第一个问题中提到这个问题。 有人还指出,抛出一个NullReferenceException是错误的,是的。 这就是为什么我不扔它,我只是让它发生(让CLR扔它)不守护的方法。 我认为我赞成ArgumentNullException(这是我迄今为止使用的),但是我仍然认为至less有空间来反对NullReferenceException,因为在将要使用该方法的大多数地方它似乎更自然。

扩展方法未被识别

在导入的程序集中存在扩展方法时需要什么? 我在类库项目中构build了一个项目,但在我的Web项目中没有识别出引用该库的项目。 库中的所有其他类和方法都是可见的,但是这种扩展方法不是。 扩展方法在库中使用时可见。

枚举的扩展方法,而不是枚举的实例

我有一个枚举我的东西是这样的: public enum Things { OneThing, AnotherThing } 我想为这个枚举编写一个扩展方法(类似于这里的Prize的答案 ),但是当这个方法在枚举的一个实例上工作时,ala Things thing; var list = thing.ToSelectList(); 我希望它在实际枚举上工作,而不是: var list = Things.ToSelectList(); 我可以做 var list = default(Things).ToSelectList(); 但我不喜欢那个:) 我已经接近以下扩展方法: public static SelectList ToSelectList(this Type type) { if (type.IsEnum) { var values = from Enum e in Enum.GetValues(type) select new { ID = e, Name = e.ToString() […]

如何比较可空types?

我有几个地方,我需要比较2(空)值,看看他们是否是相同的。 我觉得在框架中应该有一些东西来支持这个,但是找不到任何东西,所以应该有以下几点: public static bool IsDifferentTo(this bool? x, bool? y) { return (x.HasValue != y.HasValue) ? true : x.HasValue && x.Value != y.Value; } 然后,在代码中我有if (x.IsDifferentTo(y)) … 然后我有类似的方法可为空,可空双打等 有没有更简单的方法来查看两个可空types是否相同? 更新: 原来这个方法存在的原因是因为代码已经从VB.Net转换,其中Nothing = Nothing返回false(比较C#,其中null == null返回true)。 VB.Net代码应该使用.Equals…来代替。

计算IEnumerable的计数(非通用)

任何人都可以帮助我IEnumerable Count扩展方法(非通用接口)。 我知道这不是在LINQ支持,但如何手动写入?