Tag: 扩展 方法

为什么在尝试使用动态参数调用扩展方法时出现错误CS1973

请考虑以下代码: internal static class Program { public static string ExtensionMethod(this string format, dynamic args) { return format + args.ToString(); } private static void Main() { string test = “hello “; dynamic d = new { World = “world” }; // Error CS1973 ‘string’ has no applicable method named ‘ExtensionMethod’ // but appears to have an […]

使用动态类型调用generics扩展方法

我正在尝试执行返回类型为T的对象的扩展方法,但我正在尝试根据Header / Detail动态generics类型来设置类型T dynamic。 这可能有点冗长…… using System; using System.Collections.Generic; namespace Blah { public interface IHeader { string Name { get; set; } IDetail Detail { get; set; } } public interface IDetail { //Nothing the ‘Real’ implementation of this //interface will have it’s own properties. } public class GenericHeader : IHeader { public string Name […]

将C#集合拆分为相等的部分,保持排序

我正在尝试将一个集合拆分成多个集合,同时保持我对集合的排序。 我尝试使用以下扩展方法,但它错误地打破了它们。 基本上,如果我要查看集合中的项目,与加入的分解集合相比,顺序应该相同。 这是我使用的代码不起作用: public static IEnumerable<IEnumerable> Split(this IEnumerable list, int parts) { int i = 0; var splits = from name in list group name by i++ % parts into part select part.AsEnumerable(); return splits; } int parts =子枚举数

为什么C#允许通过接口扩展方法而不是类来进行多重inheritance?

我已经检查了其他问题,但令人惊讶的是,这个问题似乎没有被问到。 使用Extension方法,接口提供有限但真正的实现多重inheritance。 这带来了Diamond问题,与基于类的多inheritance相同。 为什么这比基于类的多重inheritance更好或更可接受,这么多人似乎觉得这么可怕? 它实际上似乎是一种更糟糕的实现多重inheritance的方式,因为扩展方法不能进入接口本身,甚至不能进入实现接口的类,但最终可能分散在多个静态实用程序类中。 Eric Lippert在他的博客(2009年10月5日上午9:29)似乎对扩展属性的概念持开放态度,甚至提到了扩展事件,扩展操作符,扩展构造函数(也称为“工厂模式”)的可能性。 因此可以进一步扩展通过接口的实现。 编辑:为了阐明一个类是否inheritance了两个接口,这两个接口都具有相同名称和类型参数的扩展方法,如果调用方法而不显式命名接口,则会产生编译错误。 考虑到这一点,我错了,因为这不是钻石问题。 然而,考虑到这一点提出了一个问题,即钻石问题与其他歧义相比有多重要? 为什么Diamond问题难以解决,它是否可以通过简单的编译错误来获取,就像接口扩展方法类冲突并且不能隐式解析一样? 即使在基于类的多重inheritance中,也可能存在非基于Diamond的成员签名冲突。

转换为IEnumerable ?

我写了这个扩展方法: public static class A { public static IEnumerable AsDynamic(this IEnumerable f) { foreach (var element in f) { yield return (dynamic) element; } } } 并测试了它: List l = new List(){1,2,3}; Console.WriteLine ( l.AsDynamic().GetType()); 但是输出是: typeof (IEnumerable) 为什么它不是typeof (IEnumerable) ? 我怎么能让它像它一样?

Linq扩展方法,如何在集合中查找子递归

我已经熟悉了Linq,但对扩展方法了解甚少,我希望有人可以帮助我。 所以我有这个分层集合伪代码,即: class Product prop name prop type prop id prop List children 我有一个产品列表产品列表。 有没有什么办法可以通过id使用扩展方法在这个集合中查找产品? 换句话说,我需要在层次结构中的某个位置使用一个项目。

在扩展方法中保留状态

C#团队之前曾考虑过向C#添加扩展属性,事件等。 Per Eric Lippert: http://blogs.msdn.com/b/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx 然而,为了使这些特征有用,它们必须能够用对象存储一些新的状态。 看起来这样做的唯一方法是使用字典并将对象的每个实例与其他状态相关联。 如果可以通过创建我自己的字典(以及可能的get / set扩展方法)“手动”复制此function将是有用的。 但是,为了将对象的特定实例与某个状态相关联,您需要散列对该对象的实际引用 。 在另一种语言中,您可以通过散列其内存位置来实现此目的,但是在C#中不能保证保持不变,并且使用不安全的代码来完成此function远非理想。 有没有人知道是否有可能获得一些对象的可引用引用,该对象在对象的内部状态发生变化时不会改变? 显然有一些内部机制可以跟踪单个对象而不管它们的内存位置如何,但我不确定它是否暴露给用户代码。 注意:简单地散列对象本身根本不起作用,因为GetHashCode()依赖于对象的内部状态而不是它所在的对象 。 感谢您的任何见解。

哪种机制是扩展Dictionary以处理丢失键的更好方法,为什么?

我发现自己有很多小麻烦 – 我有一个Dictionary ,其中包含可能存在或不存在的值。 所以正常的行为是使用索引器,如下所示: object result = myDictionary[“key”]; 但是,如果”key”不在字典中,则抛出KeyNotFoundException ,所以你这样做: object val; if (!myDictionary.TryGetValue(“key”, out val)) { val = ifNotFound; } 这很好,除了我可以连续加载这些 – TryGetValue开始觉得可怕的笨重。 因此选项1是一种扩展方法: public static TValue TryGet( this Dictionary input, TKey key, TValue ifNotFound = default(TValue)) { TValue val; if (input.TryGetValue(key, out val)) { return val; } return ifNotFound; } 这让我做: object […]

通用扩展方法解析失败

以下程序无法编译,因为在出​​错的行中,编译器选择使用单个T参数作为分辨率的方法,因为List不适合单个T的通用约束而失败。 编译器无法识别可以使用的其他方法。 如果我删除了单T方法,编译器将正确地找到许多对象的方法。 我已经阅读了两篇关于通用方法解析的博客文章,其中一篇来自JonSkeet,另一篇来自Eric Lippert,但我无法找到解释或解决问题的方法。 显然,使用两个具有不同名称的方法会起作用,但我喜欢这样一个事实:对于这些情况,您只有一种方法。 namespace Test { using System.Collections.Generic; public interface SomeInterface { } public class SomeImplementation : SomeInterface { } public static class ExtensionMethods { // comment out this line, to make the compiler chose the right method on the line that throws an error below public static void Method(this T parameter) […]

为什么VS 2008不在Intellisense中为String类显示扩展方法

由于String实现了IEnumerable ,我期待在Intellisense中看到Enumerable扩展方法,例如,在输入句点时 String s = “asdf”; s. 我期待看到.Select(…) .ToList()等等。然后我很惊讶看到扩展方法确实在字符串类上工作,它们只是没有出现在Intellisense中。 有人知道为什么吗? 这可能与这个问题有关。