Tag: extension methods

对象的C#扩展方法

在Object类上使用扩展方法是个好主意吗? 我想知道是否通过注册此方法,如果您正在承担性能损失,因为它将加载到上下文中加载的每个对象。

将扩展方法添加到字符串类 – C#

不知道我在这里做错了什么。 无法识别扩展方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using StringExtensions; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { RunTests(); } static void RunTests() { try { ///SafeFormat SafeFormat(“Hi There”); SafeFormat(“test {0}”, “value”); SafeFormat(“test missing second value {0} – {1}”, “test1”); SafeFormat(“{0}”); //regular format RegularFormat(“Hi There”); RegularFormat(“test {0}”, “value”); […]

“谨慎使用推广方法”背后的动机是什么?

我发现它们是扩展现有类的一种非常自然的方式,特别是当您只需要将某些function“点焊”到现有类时。 微软表示,“一般来说,我们建议您谨慎实施扩展方法,并且只在必要时才实施。” 然而,扩展方法构成了Linq的基础; 事实上,Linq是创建扩展方法的原因。 是否存在使用扩展方法而不是inheritance或组合的特定设计标准? 他们气馁的标准是什么?

扩展空检查的最佳方法是什么?

你这都是这样的: public void Proc(object parameter) { if (parameter == null) throw new ArgumentNullException(“parameter”); // Main code. } Jon Skeet曾经提到他有时会使用扩展来进行检查,所以你可以做到: parameter.ThrowIfNull(“parameter”); 所以我得到了这个扩展的两个实现,我不知道哪个是最好的。 第一: internal static void ThrowIfNull(this T o, string paramName) where T : class { if (o == null) throw new ArgumentNullException(paramName); } 第二: internal static void ThrowIfNull(this object o, string paramName) { if (o […]

由类重写的扩展方法不会发出警告

我在另一个线程中进行了讨论,发现类方法优先于具有相同名称和参数的扩展方法。 这很好,因为扩展方法不会劫持方法,但假设您已向第三方库添加了一些扩展方法: public class ThirdParty { } public static class ThirdPartyExtensions { public static void MyMethod(this ThirdParty test) { Console.WriteLine(“My extension method”); } } 按预期工作:ThirdParty.MyMethod – >“我的扩展方法” 但是然后ThirdParty更新它的库并添加一个与扩展方法完全相同的方法: public class ThirdParty { public void MyMethod() { Console.WriteLine(“Third party method”); } } public static class ThirdPartyExtensions { public static void MyMethod(this ThirdParty test) { Console.WriteLine(“My extension […]

使用generics创建HtmlHelper扩展方法

我对创建generics方法并不熟悉,所以我想我会把这个问题提交给社区,看看会有什么回来。 它甚至可能不是generics的有效使用! 我想创建一个HtmlHelper扩展方法,我可以指定该方法是某种类型。 我将该类型的实例和TagBuilder对象的实例传递给该方法。 然后我将标记的class属性指定为我传入的对象的类型,并将所有对象的属性序列化为标记的属性。 编辑…这样做的好处是我可以轻松地将我的Html元素序列化为javascript对象,以便jQuerying到服务器和模型绑定,以及为类型指定样式的能力…结束编辑 此代码示例可能会澄清。 我有这样的类型: public class MyType { public int Prop1 { get; set; } public int Prop2 { get; set; } public MyType(int val1, int val2) { this.Prop1 = val1; this.Prop2 = val2; } } 我在想的是生成一个帮助方法,可能有类似这样的签名: public static string GetTag(this HtmlHelper h, object myType, TagBuilder tag) { // cast myType […]

如何对具有ExpandoObject类型的对象应用扩展方法?

这是我的代码: public static class DynamicExtensions public static void Add(this ExpandoObject obj, string path){ dynamic _obj = obj; if (_obj == null) throw new ArgumentNullException(“obj”); _obj.path = path; } } 但是当我以这种方式调用它时,我得到“’System.Dynamic.ExpandoObject’的错误不包含’Add’的定义”: dynamic obj = new ExpandoObject(); obj.Add(“p1”); 怎么解决? 提前致谢!

如何防止提供扩展方法的公共类出现在Intellisense中?

有没有办法“隐藏”一个类的名称,其唯一目的是提供Intellisense的扩展方法? 我想从Intellisense列表中删除类名,但需要通过Intellisense以通常的方式将类的扩展方法用于外部程序集。

Lambda和Expression.Call用于扩展方法

我需要为这样的方法实现一个表达式: var prop = Expression.Property(someItem, “Name”); var value = Expression.Constant(someConstant); var contains = typeof(string).GetMethod(“Contains”, new[] {typeof(string)}); var expression = Expression.Call(prop, contains, value); 但对于我的扩展方法: public static class StringEx { public static bool Like(this string a, string b) { return a.ToLower().Contains(b.ToLower()); } } 不幸的是,下一个代码为参数“method”抛出了ArgumentNullException: var like = typeof(string).GetMethod(“Like”, new[] {typeof(string)}); comparer = Expression.Call(prop, like, value); 我做错了什么?

使用扩展方法的entity framework分页很慢?

我在C#中的entity framework中查询速度有问题。 我创建了一个名为Page的扩展方法来处理分页,但是当我使用它时,查询变得非常慢。 如果我只是做.Skip(page.Value * pageSize.Value).Take(pageSize.Value)而不是使用Page,查询得到的速度要快得多。 我想在使用Page时,在分页之前获取所有联系人。 有没有办法防止这种情况或我做错了什么? 查询: var contacts = db.Contacts .Where(x => x.AccountID == accountID && x.Deleted == false) .OrderByDescending(x => x.FirstName) .ThenBy(x => x.LastName) .ThenBy(x => x.CreatedDate) .Page(page, pageSize); return contacts.ToList(); 扩展方法: public static IEnumerable Page(this IEnumerable elements, int? page, int? pageSize) { if (page.HasValue && pageSize.HasValue) return elements.Skip(page.Value * pageSize.Value).Take(pageSize.Value); […]