我可以在 .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 吗? 的相关文章

  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 路由器出口的 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 不能 成立 您是否缺