Tag: 扩展方法

如何摆脱烧制锅炉板代码的事件?

我正在开发一个事件驱动的应用程序并运行multithreading,所以我有很多事件被解雇并以“保存方式”触发它们我按照以下方式执行此操作: public static void OnEVENT(EventArgs args) { var theEvent = EVENT; if (theEvent != null) theEvent(this, args); } 这个模式在我的应用程序中重复多次。 有没有办法摆脱这种模式的重复并以通用的方式实现这一点?

IQueryable Extension:创建lambda表达式以查询关键字的列

我从CodePlex上的这个例子开始使用IQueryable扩展方法。 我认为我需要的是一个IQueryable扩展方法到“Where”,方法签名如下所示: public static IQueryable Where(this IQueryable source, string columnName, string keyword) 并有效地做到这一点(假设T.columnName是字符串类型): source.Where(p => p.ColumnName.Contains(“keyword”)) 使用上面的CodePlex示例,我想我理解他如何使OrderBy方法工作,但我的问题似乎有点复杂,我不知道如何让Contains(“关键字”)部分工作。 提前致谢, –ed 更新:9/13/2010太平洋标准时间下午6:26 我认为以下内容可行,但最终得到一个NotSupportedException(当LINQ to Entities时,LINQ表达式节点类型’Invoke’不受支持。)当我通过Count()执行表达式时。 有任何想法吗? public static IQueryable Where(this IQueryable source, string columnName, string keyword) { var type = typeof(T); var property = type.GetProperty(columnName); if (property.PropertyType == typeof(string)) { var parameter = Expression.Parameter(type, “p”); var propertyAccess […]

C# – 无法调用HttpConfiguration扩展方法

我无法调用HttpConfiguration扩展方法: using System.Configuration; using System.Web.Http; … var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); // <– error 错误:’System.Web.Http.HttpConfiguration’不包含’MapHttpAttributeRoutes’的定义,并且没有可以找到接受类型’System.Web.Http.HttpConfiguration’的第一个参数的扩展方法’MapHttpAttributeRoutes’(你错过了吗?使用指令或程序集引用?) 我尝试使用System.Web.Http版本4和5,以及“.NET Framework 4.5.2”和“.NET Framework 4”。 我错过了什么? 参考

按一些标准从集合中选择最大项目

我是.net 3.5的新手。 我有一个项目集合: IList models; 哪里 class Model { public string Name { get; private set; } } 我想得到名称长度最长的元素。 我试过了 string maxItem = models.Max(model => model.Name.Length); 但它当然会返回最大长度(我需要一个Model对象)。 我知道有一种方法可以使用扩展方法,但我不知道如何。

GroupBy和Select扩展方法帮助

我正在使用以下代码尝试GroupBy几个字段: var cars = tmp.Select(a => new { a.Make, a.Model, a.Year }); cars = cars.Distinct() .OrderBy(a => a.Make) .ThenBy(a => a.Model); var groupedCars = cars.GroupBy(a => new { a.Make, a.Model }) .Select(b => new { b.Make, b.Model, b.Year }); 不幸的是,最后一行代码给了我错误,因为无法识别这三个字段。 ‘System.Linq.IGrouping(AnonymousType#1,AnonymousType#2)’不包含’Make’的定义,也没有扩展方法’Make’接受类型’System.Linq.IGrouping的第一个参数(AnonymousType#1,AnonymousType) #2)’可以找到(你是否错过了使用指令或程序集引用?) 所有三个字段(Make,Model,Year)都是相同的错误。 任何想法如何解决这一问题?

扩展方法的ArgumentNullException或NullReferenceException?

在null实例(扩展方法不允许)的情况下调用扩展方法时,您认为最好的exception类型是什么? 由于扩展方法只是静态方法,你可以说它应该是ArgumentNullException,但另一方面它们像实例方法一样使用,因此使用NullReferenceException可能更自然。 我们来看下面的例子: public static string ToInvariantString(this IFormattable value, string format) { return value.ToString(format, CultureInfo.InvariantCulture); } 这样,如果value参数为null,则抛出NullReferenceException。 另一个例子是: 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(这是我到目前为止所使用的)但我仍然认为至少有空间来反对NullReferenceException,因为在大多数将要使用该方法的地方看起来更自然。

如何编写正确的静态方法 – multithreading安全

我假设静态方法不应该像第一个片段那样写,或者我错了? public static class ExtensionClass { private static SomeClass object1; private static StringBuilder sb; private static string DoSomething() { sb.AppendLine(object1.SomeValue); } public static string ExtensionMethod(this HtmlHelper helper, SomeClass _object1) { object1 = _object1; sb = new StringBuilder(); DoSomething(); return sb.ToString(); } } 所以我想出了这个: public static class ExtensionClass { private static string DoSomething(ref StringBuilder _sb,SomeClass object1) […]

扩展方法和通用约束的问题

我有一个基本接口和几个inheritance的接口。 基本接口有扩展方法,用于修改对象并返回基类的新实例( IChildA.Touch() => IBase , IBase.Touch() => IBase )。 对于一个inheritance路径( IChildB和后代),我想实现返回与调用对象相同类型的对象的扩展方法( IGrandChildB.Touch() => IGrandChild )。 为此,我想指定一个受限于IChildB后代的通用扩展方法。 这工作到目前为止,但现在编译器无法解析来自IChildA的调用。 它尝试使用IChildB路径的扩展方法,而不是使用IBase接口的扩展方法。 有没有一种优雅的方法来解决这个问题? public interface IBase {} public interface IChildA : IBase {} public interface IChildB : IBase {} public static class BaseExtensions { public static IBase Touch(this IBase self) { return self; } public static T Touch(this […]

使用多个generics类型参数键入推断

我不明白为什么C#在以下完整情况下不会推断出类型: public interface IThing {} public class Thing1 : IThing {} public class Thing2 : IThing {} public interface IContainer {} public class Container1 : IContainer { public IThing A { get { return new Thing1(); } } public IThing B { get { return new Thing2(); } } } public class Container2 : IContainer […]

对类库使用系统命名空间:好的或坏的

在我的类库中使用“系统命名空间”是一个好主意吗? 样品: namespace System.Web { public static class RequestExtensions { public static bool IsPost(this HttpRequest r) { return string.Compare(r.HttpMethod, “POST”, StringComparison.OrdinalIgnoreCase) == 0; } } } 优点:无需包含其他uses-clause(特别是对于扩展方法),因此在添加对库的引用后,所有子句都可以直接使用。 最好的示例是NUnitEx项目(使用NUnit的命名空间)。 缺点:潜在的名称冲突。