Tag: extension methods

将新属性添加到字符串类C#

我想知道是否可以将新属性添加为字符串类的扩展属性。 我正在寻找的是这样的 string.Empty 我想做一个扩展,例如: string.DisplayNone; 我可以将扩展属性添加到字符串C#类中,我可以像处理string.Empty一样以类似的方式调用它吗?

带有C#扩展function的XSLT中的错误消息

尝试在XSLT中实现C#扩展函数时收到以下错误。 不支持具有CLR类型“Char []”的扩展函数参数或返回值。** 码: 有人可以解释这个错误信息以及如何通过它吗? 编辑:我需要一个解决方案仍然允许我实现拆分function并使用返回的数组。 谢谢!

使用F#代码中的C#中定义的扩展方法

我为C#库中的各种类定义了一系列扩展方法。 我目前正在编写一些F#代码,而不是重写代码,我只想在我的F#代码中使用现有的扩展方法。 我添加了对库的引用并使用open语句导入命名空间,但扩展方法没有出现在F#中

为什么我不能从扩展方法调用PropertyChanged事件?

我试图编写一个类来避免像“RaisePropertyChanged”这样的方法。 我知道我可以从具有该实现的类inheritance,但在某些情况下我不能。 我尝试使用扩展方法,但Visual Studio抱怨。 public static class Extension { public static void RaisePropertyChanged(this INotifyPropertyChanged predicate, string propertyName) { if (predicate.PropertyChanged != null) { predicate.PropertyChanged(propertyName, new PropertyChangedEventArgs(propertyName)); } } } 它说: “事件’ System.ComponentModel.INotifyPropertyChanged.PropertyChanged’只能出现在+ =或 – =的左侧 ”

使用扩展:权衡利弊与利弊

最近我问了一个关于如何清理我认为丑陋代码的问题。 一个建议是创建一个扩展方法,它将执行所需的function并返回我想要的function。 我的第一个想法是’太棒了! Extensions有多酷……“但经过一番思考后,我开始重新考虑使用Extensions …… 我主要担心的是,Extensions似乎是一种自定义的“快捷方式”,可以让其他开发人员难以遵循。 我理解使用扩展可以帮助使代码语法更容易阅读,但是如何跟随幕后的声音呢? 以我之前的问题代码片段为例: if (entry.Properties[“something”].Value != null) attribs.something = entry.Properties[“something”].Value.ToString(); 现在用扩展名替换它: public static class ObjectExtensions { public static string NullSafeToString(this object obj) { return obj != null ? obj.ToString() : String.Empty; } } 并使用语法调用: attribs.something = entry.Properties[“something”].Value.NullSafeToString(); 定义一个方便的方法,但它真的值得另一个类对象的开销吗? 如果有人想重用我的代码片段而不理解扩展,会发生什么? 我可以像使用相同的结果一样轻松地使用语法: attribs.something = (entry.Properties[“something”].Value ?? string.Empty).ToString() 所以我做了一些挖掘,发现了一些关于使用Extensions的优点/缺点的文章。 对于那些倾向于看看以下链接的人: MSDN:扩展方法 扩展方法最佳实践 扩展方法 […]

C#:在扩展方法中validation“this”参数的最佳实践

假设我有一个扩展方法 public static T TakeRandom(this IEnumerable e) { … 要validation参数e,我应该: A)if(e == null)抛出新的NullReferenceException() B)if(e == null)抛出新的ArgumentNullException(“e”) C)不检查e 什么是共识? 我的第一个想法是始终validation参数,因此抛出ArgumentNullException。 然后,由于TakeRandom()成为e的方法,也许它应该是NullReferenceException。 但是如果它是NullReferenceException,如果我尝试在TakeRandom()中使用e的成员,那么无论如何都会抛出NullReferenceException。 也许我应该使用Reflector达到峰值并找出框架的作用。

如何在scriptcs csx脚本中定义扩展方法

我正在使用ScriptCS (这很棒!)但我无法弄清楚如何在.csx脚本文件中定义扩展方法 。 举个例子: using System.IO; public static class Extensions { public static string Remove(this string source, params string[] toRemove) { foreach(var r in toRemove) { source = source.Replace(r,””); } return source; } } string[] entries = Directory .GetFiles( @”C:\Users\blah\blah”, “*.mp4”, SearchOption.AllDirectories) .Select( p => p.Remove(“Users”)) .ToArray(); foreach(var e in entries) { Console.WriteLine(e); } 这会产生错误: […]

扩展方法优先级

我从https://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx上读到,基本类型上具有相同名称和签名的扩展方法永远不会被调用,但是“覆盖”了什么呢?扩展方法本身: using System; using System.Linq; using System.Collections.Generic; namespace ConsoleApplication1 { public class Program { public static void Main(string[] args) { var query = (new[] { “Hans”, “Birgit” }).Where(x => x == “Hans”); foreach (var o in query) Console.WriteLine(o); } } public static class MyClass { public static IEnumerable Where(this IEnumerable source, Func predicate) { foreach […]

如何在F#中定义T 的类型扩展名?

在C#中,我可以为类型为T的generics数组定义一个扩展方法,如下所示: public static T GetOrDefault(this T[] arr, int n) { if (arr.Length > n) { return arr[n]; } return default(T); } 但对于我的生活,我无法弄清楚如何在F#中做同样的事情! 我尝试type ‘a array with , type array with并type ‘a[] with ,编译器对它们中的任何一个都不满意。 任何人都可以告诉我在F#中这样做的权利是什么? 当然,我可以通过掩盖arrays模块并为此轻松添加function来实现这一点,但我真的想知道如何将其作为扩展方法!

使用System.CodeDom生成扩展方法

有没有人试过在.NET 4.0下使用System.CodeDom生成扩展方法? 似乎没有任何方法可以将CodeMemberMethod或CodeParameterDeclarationExpression指定为扩展方法/参数。 如果这是不可能的,有什么好的解决方法吗? 谢谢