我可以在 .NET 2.0 或 3.0 中使用扩展方法和 LINQ 吗?

2024-04-28

当我尝试使用 .NET 2.0 或 3.0 运行时添加扩展方法时,出现错误:

无法定义新的扩展方法,因为编译器需要 类型“System.Runtime.CompilerServices.ExtensionAttribute”不能 成立。您是否缺少对 System.Core.dll 的引用?

但是当我尝试将 System.Core 添加到项目时,我在可用引用列表中找不到 System.Core。我需要做什么才能使用扩展方法LINQ http://en.wikipedia.org/wiki/Language_Integrated_Query在我的项目中?


扩展方法直到 3.5 才添加到 .NET。然而,这并不是对 CLR 的更改,而是对编译器的更改 http://www.hanselman.com/blog/HowDoExtensionMethodsWorkAndWhyWasANewCLRNotRequired.aspx添加了它们,因此您仍然可以在 2.0 和 3.0 项目中使用它们!唯一的要求是您必须有一个可以创建 3.5 项目的编译器才能执行此解决方法(Visual Studio 2008 及更高版本)。

当您尝试使用扩展方法时出现的错误具有误导性,因为您并不真正需要System.Core.dll使用扩展方法。当您使用扩展方法时,编译器会在幕后添加[Extension] http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.extensionattribute.aspx函数的属性。如果你有一个编译器能够理解如何处理[Extension]如果您自己创建该属性,则可以在 2.0 和 3.0 项目中使用它。

只需将以下类添加到您的项目中,然后您就可以开始使用扩展方法:

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
    public class ExtensionAttribute : Attribute
    {
    }
}

上面的代码块位于里面系统核心DLL http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.extensionattribute.aspx,这就是为什么错误提示您需要包含 DLL 文件才能使用它们。


现在,如果您想要 LINQ 功能,则需要做一些额外的工作。您将需要自己重新实现扩展方法。来模仿完整的LINQ 到 SQL http://msdn.microsoft.com/en-us/library/bb386976.aspx功能代码可能会变得相当复杂。但是,如果您只是使用LINQ 到对象 http://msdn.microsoft.com/en-us/library/bb397919.aspx大多数 LINQ 方法的实现并不复杂。以下是我为帮助您入门而编写的一个项目中的一些 LINQ to Objects 替换函数。

public static class LinqReplacement
{
    public delegate TResult Func<T, TResult>(T arg);
    public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);

    public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
    {
        if (source == null)
            throw new ArgumentNullException("source");
        if (predicate == null)
            throw new ArgumentNullException("predicate");

        foreach (TSource item in source)
        {
            if (predicate(item) == true)
                return item;
        }

        throw new InvalidOperationException("No item satisfied the predicate or the source collection was empty.");
    }

    public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
    {
        if (source == null)
            throw new ArgumentNullException("source");

        foreach (TSource item in source)
        {
            return item;
        }

        return default(TSource);
    }

    public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source)
    {
        foreach (object item in source)
        {
            yield return (TResult)item;
        }
    }

    public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)
    {
        if (source == null)
            throw new ArgumentNullException("source");
        if (selector == null)
            throw new ArgumentNullException("selector");

        foreach (TSource item in source)
        {
            foreach (TResult subItem in selector(item))
            {
                yield return subItem;
            }
        }
    }

    public static int Count<TSource>(this IEnumerable<TSource> source)
    {
        var asCollection = source as ICollection;
        if(asCollection != null)
        {
            return asCollection.Count;
        }

        int count = 0;
        foreach (TSource item in source)
        {
            checked //If we are counting a larger than int.MaxValue enumerable this will cause a OverflowException to happen when the counter wraps around.
            {
                count++;
            }
        }
        return count;
    }
}

一个完全重新实现 LINQ to Objects 的库ExtensionAttribute已经添加的可以在林克桥 https://code.google.com/p/linqbridge/项目(谢谢阿隆·古拉内克 https://stackoverflow.com/users/149265/allon-guralnek).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 .NET 2.0 或 3.0 中使用扩展方法和 LINQ 吗? 的相关文章

  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题

随机推荐

  • 路由器出口的 Angular 2 输出

    我想从在路由器出口内呈现的子组件进行导航 我的父组件有一个路由器配置 我想在某些事件上手动导航 但我不知道如何在没有输出的情况下从子级向父级传递一些数据 用于导航 因为这个结构不起作用
  • 浮点数和字符串转换的奇怪行为

    我已将其输入到 python shell 中 gt gt gt 0 1 0 1 0 010000000000000002 我预计 0 1 0 1 不是 0 01 因为我知道以 10 为底的 0 1 在以 2 为底的情况下是周期性的 gt g
  • 如何舍入仅在 pandas 中显示的值,同时保留数据框中的原始值?

    当我使用 head 或 tail 时 我希望仅对 DataFrame 中的值进行舍入以用于显示目的 但我希望 DataFrame 保留原始值 我尝试使用 round 方法 但它改变了原始 DataFrame 中的值 我不希望每次都为此目的创
  • 如何在Python中动态创建类的类方法[重复]

    这个问题在这里已经有答案了 如果我将一个小 python 程序定义为 class a def func self return asdf Not sure what to resplace init with so that a func
  • 休眠!实体

    这一页 http docs jboss org hibernate orm 4 1 manual en US html single inheritance tableperconcreate polymorphism建议 实体 如果您想避
  • 如何让 div 调整其高度以适应容器?

    如何让导航 div 向下展开或使其高度与其父 div 相同 border 0 padding 0 margin 0 container margin left auto margin right auto border 1px solid
  • Java:从文件中读取整数到数组中

    File fil new File Tall txt FileReader inputFil new FileReader fil BufferedReader in new BufferedReader inputFil int tall
  • 根据是否满足条件对绘图区域进行着色

    我正在使用创建线图ggplot and geom line 随着时间的推移而发展的价值观走廊 有时可能会发生上限低于下限 我将其称为 反转 并且我想突出显示在我的图中发生这种情况的区域 例如使用不同的背景颜色 搜索 Google 和 Sta
  • 在 asp.net 中执行回发操作后刷新页面

    我在我的 asp net 网格中添加了命令按钮 使用该按钮执行操作后 我们刷新网格以反映新数据 基本上此操作会复制网格行 Now when user refresh the page using F5 an alert message is
  • Python - 将长/整数值与 == 进行比较并且是[重复]

    这个问题在这里已经有答案了 可能的重复 Python is 运算符对整数的行为异常 https stackoverflow com questions 306313 python is operator behaves unexpected
  • For-Of 循环与 For 循环

    这两者是相同的还是可以互换的 在哪些用例中 人们会选择其中一种而不是另一种 for let i of array some code for let i 0 i lt array length i some code EXAMPLE 完成该
  • Android:如何检查ScrollView内的View是否可见?

    我有一个ScrollView其中持有一系列Views 我希望能够确定视图当前是否可见 如果它的任何部分当前由ScrollView 我希望下面的代码可以做到这一点 令人惊讶的是它没有 Rect bounds new Rect view get
  • Javascript 在执行数组“推送”时为数组 Key 命名

    我有 3 组单选按钮 每组包含多个单选按钮 在使用时data toggle buttons 在 bootstrap3 中 对于每一组 我可以确保每组仅选择一个答案 到目前为止一切都很好 下面的函数在单击事件上触发并返回所选项目的值 我的问题
  • 如何自动生成已实现接口的方法

    PhpStorm 中是否有一种方法可以自动生成给定类正在实现的接口所需的空方法 假设我们有一个包含 3 个方法的接口 当定义实现该接口的新类时 一些选项可以为所有必需的方法自动生成容器 你当然可以 有 3 种方法可以做到这一点 Press
  • 错误 401 - 浏览器中的 Spring Boot 执行器登录名/密码

    我将 Spring Boot 与执行器一起使用 并添加安全配置 management port 8088 management address 127 0 0 1 management security enabled true secur
  • Listview Onclick Listener 更新 Cardview 布局后不工作

    我已经更新了布局 用按钮替换了 ImageViews 当我将旧布局与 ImageViews 一起使用时 Listview OnCLick 侦听器现在无法工作 如果需要进一步正确格式化 请告诉我 我们将提供任何帮助 活动中的监听器 lvIte
  • 在 awk 中按特定顺序打印文件

    我正在关注这个链接https stackoverflow com a 54599800 10220825 https stackoverflow com a 54599800 10220825 file txt Iteration 1 RA
  • 在正确的时机批量创建视频 .srt 字幕

    好家伙 我什至不知道从什么开始 所以 我有一个包含很多视频的文件夹 我需要的是使用这些视频的名称创建字幕 同时注意其长度以创建 srt 格式的字幕 我已经查找了一些信息并复制了一些代码 echo off set dirpath 1 dir
  • 谷歌可视化将 0 轴与两个不同的 y 轴对齐

    我正在创建一个组合图 https developers google com chart interactive docs gallery combochart与谷歌的可视化库 我正在绘制商店一天内的客流量和收入图表 我已将抽奖选项设置为
  • 我可以在 .NET 2.0 或 3.0 中使用扩展方法和 LINQ 吗?

    当我尝试使用 NET 2 0 或 3 0 运行时添加扩展方法时 出现错误 无法定义新的扩展方法 因为编译器需要 类型 System Runtime CompilerServices ExtensionAttribute 不能 成立 您是否缺