【问题标题】:Creating an extension method in a .Net 2.0 project, compiling with C# 4.0在 .Net 2.0 项目中创建扩展方法,使用 C# 4.0 编译
【发布时间】:2012-01-24 15:20:06
【问题描述】:

我有一个需要更新的旧产品,用 C# 和 .Net 2.0 编写。该项目已更新为与 Visual Studio 2010(包括 C# 4.0 编译器)一起使用,但我无法将框架从 2.0 升级到任何更高版本。

我发现多篇文章(如this question)是在 VS 2008 时写的,随 C# 3.0 编译器一起提供,说明您可以通过定义自己的扩展方法属性类来创建自己的扩展方法对于使用 2.0 框架编写的项目。但是,我似乎找不到任何参考说明是否仍然需要在 .Net 2.0 项目上使用 C# 4.0。

对于我的项目,我是否仍需要定义自定义扩展属性类,或者是否改进了 C# 4.0 编译器以简化流程?

【问题讨论】:

    标签: c# visual-studio-2010 c#-4.0 compiler-construction .net-2.0


    【解决方案1】:

    我似乎找不到任何参考说明在 .Net 2.0 项目上使用 C# 4.0 是否仍然需要这样做。

    是的,是的。编译器需要该属性。是您自己定义还是使用System.Core 中的那个取决于您自己。尽管在您的特定情况下System.Core 不是一个选项,因为这只是.NET 3.5 的一部分。

    升级到更高版本(3.5 或更高版本)后,您可以安全地从您的项目中删除此属性,只使用System.Core 中的属性。

    如果您已升级到 Visual Studio 2010;那么您使用的是 C# 4.0 编译器。这意味着您只需要一个ExtensionAttribute

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

    必须在这个确切的命名空间中。

    一旦你在某个地方得到了它,你就可以用正常的方式声明一个扩展方法(因为你使用的是 C# 4.0 编译器):

    public static class Extensions
    {
        public static string ToTitleCase(this string str)
        {
            //omitted
        }
    }
    

    然后像扩展方法一样使用它:

    var str = "hello world";
    str.ToTitleCase();
    

    您自己实际上不需要将ExtensionAttribute 放在任何东西上; C# 4.0 编译器会为您完成。本质上,编译器所需要的只是能够找到一个名为 ExtensionAttribute 的属性。

    【讨论】:

    • Brr,讨厌的黑客。虽然有效。如果他忘记删除我想象的属性,以后升级会有点痛苦。
    • @HansPassant 我认为这不会是灾难性的。编译器只会选择哪个属性是“最接近的”。如果当前程序集中有一个,它将使用那个代替。我不认为编译器关心使用了 which 属性;只要它有正确的(全)名称。同意,但有点丑。
    • 是的,这是我希望能够避免的。我需要更新的应用程序非常强大,虽然它很旧,但我仍然需要每六个月左右更新一次,由于公司要求,我无法更新框架(错误......)这似乎不像骇人听闻的骇客,但我倾向于在生产代码中不惜一切代价避免骇客。
    • @HansPassant:没问题。我在 IronScheme 中使用它(因为我以 .NET 2 为目标),但如果我以 .NET 4 为目标,它不会出错。但是有一个无害的警告。
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多