Tag: extension methods

如何管理扩展方法的命名空间?

您是否为所有扩展方法使用全局的catchall命名空间,还是将扩展方法放在与它们扩展的类相同的命名空间中? 或者您是否使用其他方法,如应用程序或特定于库的命名空间? 我问,因为我需要扩展System.Security.Principal.IIdentity ,并将扩展方法放在System.Security.Principal命名空间似乎有意义,但我从未见过这样做过。

如何使用WriteEndElement检查元素的名称

我正在用XmlWriter编写xml。 我的代码有很多这样的部分: xml.WriteStartElement(“payload”); ThirdPartyLibrary.Serialise(results, xml); xml.WriteEndElement(); // 问题是ThirdPartyLibrary.Serialise方法不可靠。 它可能会发生(取决于变量results )它不会关闭它打开的所有标记。 因此,我的WriteEndElement行被变态,消耗了关闭库的挂起标记,而不是写 。 因此,我想对WriteEndElement进行一次检查,检查元素名称,并抛出exception,除非光标位于期望的元素。 xml.WriteEndElement(“payload”); 除非光标位于文档中的预期位置,否则您可以将其XmlReader.ReadStartElement(name) 。 我怎样才能做到这一点? 编辑:此扩展方法的第二个用例是使我自己的代码更具可读性和可靠性。

静态类的扩展方法?

可能重复: 我可以将扩展方法添加到现有的静态类吗? 我知道我可以通过以下方式扩展课程。 我有一个静态类,我想扩展。 我怎么能这样做? 我想写ClassName.MyFunc() static public class SomeName { static public int HelperFunction(this SomeClass v)

在int上使用扩展方法

我正在阅读有关扩展方法的信息,并与他们进行一起讨论它们是如何工作的,我试过这个: namespace clunk { public static class oog { public static int doubleMe(this int x) { return 2 * x; } } class Program { static void Main() { Console.WriteLine(5.doubleMe()); } } } 它按预期工作,使用doubleMe方法成功扩展int,打印10。 接下来,作为一个老C家伙,我想知道我是否可以这样做: namespace clunk { public static class BoolLikeC { public static bool operator true(this int i) { return i != 0; […]

如何为int,double,float等正确编写Math扩展方法?

我想编写一系列Extension方法来简化数学运算。 例如: 代替 Math.Pow(2, 5) 我想能写 2.Power(5) 这是(在我看来)更清楚。 问题是:在编写扩展方法时如何处理不同的数字类型? 我是否需要为每种类型编写扩展方法: public static double Power(this double number, double power) { return Math.Pow(number, power); } public static double Power(this int number, double power) { return Math.Pow(number, power); } public static double Power(this float number, double power) { return Math.Pow(number, power); } 或者是否有一个技巧允许单个扩展方法适用于任何数字类型? 谢谢!

ICollection / ICollection 歧义问题

只想对语法sygar进行简单的扩展: public static bool IsNotEmpty(this ICollection obj) { return ((obj != null) && (obj.Count > 0)); } public static bool IsNotEmpty(this ICollection obj) { return ((obj != null) && (obj.Count > 0)); } 当我使用一些collections品时,它可以很好地工作,但是当我与其他人合作时,我得到了 以下方法或属性之间的调用不明确:’PowerOn.ExtensionsBasic.IsNotEmpty(System.Collections.IList)’和’PowerOn.ExtensionsBasic.IsNotEmpty(System.Collections.Generic.ICollection)’ 这个问题有任何规范的解决方案吗? 不,我不想在调用此方法之前执行强制转换;)

C#generics方法解析失败,出现模糊的调用错误

假设我已经定义了两个不相关的类型和两个具有相同签名但不同类型filter的扩展方法: public class Foo {} public class Bar {} public static class FooExtensions { public static TFoo Frob(this TFoo foo) where TFoo : Foo { } public static TFoo Brob(this TFoo foo) where TFoo : Foo { } } public static class BarExtensions { public static TBar Frob(this TBar bar) where TBar : Bar { […]

使用XPath查询从匹配的XML节点获取属性值

这似乎不应该是困难的,但我现在卡住了。 我正在尝试从与给定XPath查询字符串匹配的节点获取特定属性的属性值。 这是我到目前为止所拥有的: public static IEnumerable GetAttributes(this XmlDocument xml, string xpathQuery, string attributeName) { var doc = new XPathDocument(new XmlNodeReader(xml)); XPathNavigator nav = doc.CreateNavigator(); XPathExpression expr = nav.Compile(xpathQuery); XPathNodeIterator iterator = nav.Select(expr); while (iterator.MoveNext()) { XPathNavigator curNav = iterator.Current; if (curNav.HasAttributes) { XmlNode curNode = ((IHasXmlNode)curNav).GetNode(); if (null != curNode) { XmlAttribute attrib = curNode.Attributes[attributeName]; […]

C# – 使用扩展方法排序

我想排序一个人说的清单 List persons=new List(); persons.Add(new Person(“Jon”,”Bernald”,45000.89)); persons.Add(new Person(“Mark”,”Drake”,346.89)); persons.Add(new Person(“Bill”,”Watts”,456.899)); 基于 public enum CompareOptions { ByFirstName, ByLastName, BySalary } public enum SortOrder { Ascending, Descending } 使用lambda表达式排序的方法是什么? public static List SortPeople(this List lst, CompareOptions opt1,SortOrder ord) { lst.Sort((p,op1,op2)=>{ how to apply lambda expression here}); }

有没有办法在C#中重载扩展方法?

我有以下模型模式: public abstract class PARENTCLASS {…} public class CHILD_A_CLASS : PARENTCLASS{…} public static class EXTENSION{ public static METHOD(this PARENTCLASS parent){…} public static METHOD(this CHILD_A_CLASS child) {…} } 像上面的东西,当然会有更多的孩子(和孙子)课程,但我只是把其中一个。 问题是,当我调用扩展方法时,如下所示: PARENTCLASS cc = new CHILD_A_CLASS(); cc.METHOD(); 它将执行PARENT扩展方法而不是我期望的CHILD扩展方法。 有人知道如何实现这个? (我不考虑将METHOD本身放入类中并让它inheritance,因为我希望保持模型类清洁并远离其他逻辑)。