Tag: 扩展方法

扩展方法调用不编译,但静态方法调用相同的代码确实编译

库A调用库B使用C#扩展方法。 我从C#编译器得到了一个奇怪的错误: 类型’System.Windows.Forms.Control’在未引用的程序集中定义。 您必须添加对程序集’System.Windows.Forms,Version = 4.0.0.0的引用 库A或B都不依赖于System.Windows.Forms.Control ,也没有任何依赖于System.Windows.Forms.Control的依赖关系。 System.Windows.Forms.Control仅从同一解决方案中的另一个项目引用。 奇怪的是,如果我将调用语法更改为静态方法,它将成功编译。 //static method syntax works fine var leads = SourceLeadConfigurationHelper.GetLeads(enLeadSystem); //extension method syntax cause error //error The type ‘System.Windows.Forms.Control’ is defined in an assembly that is not referenced. var leads = enLeadSystem.GetLeads(); 扩展方法如下所示: public static class SourceLeadConfigurationHelper { public static IList GetLeads(this LeadSystem leadSystem); public static […]

C#中的重载分辨率,扩展方法和通用性

我在C#源代码中有以下场景: class A{} class Dispatch{} static class DispatchExt { public static void D(this Dispatch d, int a) { Console.WriteLine(“Generic D chosen with a = ” + a.ToString()); } public static void D(this Dispatch d, int a) { Console.WriteLine(“D chosen with a = ” + a.ToString()); } } class Program { static void D(Dispatch d, int […]

混合generics方法和扩展方法

我在Class1.GetChild() where T : DependencyObject创建了Class1.GetChild() where T : DependencyObject扩展方法。 之后,依赖于lib1.dll的所有程序集都无法编译并出现错误: 类型’System.Windows.DependencyObject’在未引用的可配置中定义。 您必须添加对程序集“WindowsBase”等的引用… 为什么依赖程序集需要WindowsBase即使它们不使用GetChild ? 。 要重现(vs2010 .net4): lib1.dll (引用WindowsBase ) namespace lib1 { public static class Class1 { public static T GetChild(this DependencyObject src) where T : DependencyObject { return default(T); } } public static class Class2 { public static int SomeExtMethod(this string src) { […]

设计选择:我是否希望扩展方法在null上抛出exception?

可能重复: C#:在扩展方法中validation“this”参数的最佳实践 我对设计选择感到矛盾,并希望听到SO社区的意见。 我在这里提出的例子只是一个可能的情况,必须进行这种设计选择 – 实际上,可能会有更多的情况。 对这个具体案例和更一般的方法都欢迎回答,并且对于如何在特定案例中做出决定的指导方针也表示赞赏。 基本上,我想知道如何考虑这个问题: 当编写一个本质上没有失败的扩展方法时,如果将null引用作为this实例传递,是否应该对参数执行null检查? 例: 我正在IEnumerable上编写一个扩展方法,它将遍历集合并执行一些Action – 基本上,这就是它的作用: public static void Each(this IEnumerable collection, Action action) { foreach (var t in collection) { action.Invoke(t); } } 我无法决定的是,如果将null传递给任一参数,这个扩展方法应该做什么。 如果我不添加任何空检查,我将在action.Invoke(T)上获得NullReferenceException ,但是如果collection为null ,for循环将默默地执行任何操作(即使action也为null ,也不会抛出任何exception。 )。 我决定添加一个null检查action ,所以我可以抛出ArgumentNullException而不是NullReferenceException 。 但是我想对这个collection做些什么呢? 选项1:添加空检查,并抛出ArgumentNullException 。 选项2:只是默默地让方法什么都不做。 哪个在将来我想使用该方法会更有用? 为什么?

通用枚举到SelectList扩展方法

我需要在项目中的任何Enum中创建一个SelectList 。 我有下面的代码,我从特定的枚举创建一个选择列表,但我想为任何枚举创建一个扩展方法。 此示例检索每个Enum值上的DescriptionAttribute值 var list = new SelectList( Enum.GetValues(typeof(eChargeType)) .Cast() .Select(n => new { id = (int)n, label = n.ToString() }), “id”, “label”, charge.type_id); 参考这篇文章 ,我该如何处理? public static void ToSelectList(this Enum e) { // code here }

错误消息“操作员”。 在将方法转换为扩展方法时,不能应用于’lambda expression’类型的操作数?

我有一个方法,我想转换为扩展方法 public static string GetMemberName(Expression<Func> item) { return ((MemberExpression)item.Body).Member.Name; } 并称之为 string str = myclass.GetMemberName(() => new Foo().Bar); 所以它评估为str = “Bar”; // It gives the Member name and not its value str = “Bar”; // It gives the Member name and not its value 现在,当我尝试将此转换为扩展方法时 public static string GetMemberName(this Expression<Func> item) { return ((MemberExpression)item.Body).Member.Name; } […]

如何使用reflection来获取generics类型的扩展方法

从各种来源的teh interwebs我收集了以下function: public static Nullable TryParseNullable(this Nullable t, string input) where T : struct { if (string.IsNullOrEmpty(input)) return default(T); Nullable result = new Nullable(); try { IConvertible convertibleString = (IConvertible)input; result = new Nullable((T)convertibleString.ToType(typeof(T), CultureInfo.CurrentCulture)); } catch (InvalidCastException) { } catch (FormatException) { } return result; } 我把它变成了一个扩展方法,如果我直接调用它就可以正常工作: int? input = new int?().TryParseNullable(“12345”); 当我尝试使用另一个generics函数的上下文中的reflection来调用它时,我的问题就出现了。 SO充满了描述如何获得generics方法和静态方法的MethodInfo的答案,但我似乎无法以正确的方式将它们组合在一起。 […]

扩展方法什么时候破坏?

我们目前正在讨论.NET中的扩展方法是否坏。 或者在什么情况下,扩展方法可能会导致难以发现的错误或以任何其他方式出现意外行为。 我们想出了: 为不受您控制的类型编写扩展方法(例如,使用GetTotalSize()扩展DirectoryInfo等)是不好的,因为API的所有者可能会引入隐藏扩展的方法 – 并且可能有不同的边缘情况。 例如,如果由于隐藏而不再使用扩展方法,则在扩展方法中对null进行测试将自动转换为NullReferenceException。 题: 除了“隐藏”我们没有想到的还有其他危险情况吗? 编辑: 另一个非常危险的情况 假设您有一个扩展方法: namespace Example.ExtensionMethods { public static class Extension { public static int Conflict(this TestMe obj) { return -1; } } } 并使用它: namespace Example.ExtensionMethods.Conflict.Test { [TestFixture] public class ConflictExtensionTest { [Test] public void ConflictTest() { TestMe me = new TestMe(); int result = me.Conflict(); […]

创建一个返回Razor @标签的辅助函数?

努力寻找我的问题的答案,因为我不确定剃刀标签的’类型’是什么。 基本上我想创建一个帮助器,沿着这些方向做一些事情: public static xxxxxxx ScriptTag(this HtmlHelper htmlHelper, string url) { return @; } 我想要这个的原因是我正在实现这篇文章中概述的扩展方法。 基本上而不是必须做: @Html.Resource(@, “js”)` 我希望能够做到: @Html.Resource(Html.ScriptTag(“Scripts/jquery-1.4.4.min.js”), “js”); 我是在这里超越星星还是可能的? 克里斯

将接口作为参数传递给扩展方法

我已经使用扩展方法来扩展html助手来制作RSS转发器: public static string RSSRepeater(this HtmlHelper html, IEnumerable rss) { string result=””; foreach (IRSSable item in rss) { result += “” + item.GetRSSItem().InnerXml + “”; } return result; } 所以我让我的一个业务对象实现IRSSable,并尝试将其传递给HTML帮助器。 但我似乎无法使它工作,我尝试过: <%=Html.RSSRepeater(ViewData.Model.GetIssues(null, null, "") as IEnumerable) %> 编译正常,但传递null Intellisense抱怨无法将IEnumerable问题传递给IEnumberable IRSSable 你是怎么做到的? 我正在调用的那个方法IEnumberable返回IEnumberable并且问题肯定会实现IRSSAble