Share via


Extension Methods without 3.5 Framework

For a time I've been avoiding extension methods.  Not because I'm opposed to using them but because of the 3.5 Framework. 

A lot of the tools I own are designed to be very light weight tools that only require the user to have 2.0 installed on their machine.  I find that the easier that tools are to install, the more likely people are to use them. 

Extension methods require the ExtensionAttribute be available.  Since the attribute is declared in a 3.5 Framework assembly it's not possible to use extension methods without the 3.5 framework.  At least, that's what I thought up until I read an recent MSDN article.

You can simply define the ExtensionAttribute in your assembly and extension methods will start working.  No references to the 3.5 framework required.  It's a lightweight solution that adds the full power of extension methods to your program.

 Namespace System.Runtime.CompilerServices
    Class ExtensionAttribute
        Inherits Attribute
    End Class
End Namespace

Comments

  • Anonymous
    November 16, 2007
    PingBack from http://msdnrss.thecoderblogs.com/2007/11/16/extension-methods-without-35-framework/

  • Anonymous
    November 16, 2007
    Could you provide a sample implementation?  I've tried to implement this in C#, and I'm getting "Type expected" compiler errors because of the use of the this keyword in following code: public static bool IsEmailAddress(this string s) You're also unclear if the ExtensionAttribute should decorate anything. Is this all available in MSDN article you mention?  If so, what's the URL?

  • Anonymous
    November 16, 2007
    Sorry for the confusion.  Below is some sample code detailing how to get this to work in C#.  For C# you don't need to decorate anything with the Extension attribute (C# has builtin syntax for extension methods).   using System; using System.Collections.Generic; using System.Text; namespace System.Runtime.CompilerServices {    class ExtensionAttribute : Attribute    {    } } namespace ConsoleApplication168 {    public static class ExtensionHolder    {        public static bool IsEmailAddress(this string s)        {            return false;        }    }    class Program    {        static void Main(string[] args)        {        }    } }

  • Anonymous
    November 16, 2007
    Here's my implementation, which still gets the "Type expected" compiler error in Visual Studio 2005: using System; using System.Runtime.CompilerServices; using System.Text.RegularExpressions; namespace System.Runtime.CompilerServices {    public class ExtensionAttribute : Attribute    {    } } namespace ConsoleApplication1 {    public static class StringExtensions    {        public static bool IsEmailAddress(this string s)        {            Regex regex = new Regex(@"^[w-.]+@([w-]+.)+[w-]{2,4}$");            return regex.IsMatch(s);        }    }    public class Program    {        public static void Main(string[] args)        {            string email = "aanttila@vertigo.com";            if (email.IsEmailAddress())            {                Console.Write("Valid");            }            else            {                Console.Write("Invalid");            }            Console.WriteLine();            Console.Write("Press <enter> to exit...");            Console.ReadLine();        }    } } Are you targeting the 2.0 runtime from VS2008?  I wonder if the compiler in VS2005 won't support the new 3.0 language features even if they are valid for 2.0.

  • Anonymous
    November 16, 2007
    Here's my implementation, which still gets the "Type expected" compiler error in Visual Studio 2005: using System; using System.Runtime.CompilerServices; using System.Text.RegularExpressions; namespace System.Runtime.CompilerServices {    public class ExtensionAttribute : Attribute    {    } } namespace ConsoleApplication1 {    public static class StringExtensions    {        public static bool IsEmailAddress(this string s)        {            Regex regex = new Regex(@"^[w-.]+@([w-]+.)+[w-]{2,4}$");            return regex.IsMatch(s);        }    }    public class Program    {        public static void Main(string[] args)        {            string email = "aanttila@vertigo.com";            if (email.IsEmailAddress())            {                Console.Write("Valid");            }            else            {                Console.Write("Invalid");            }            Console.WriteLine();            Console.Write("Press <enter> to exit...");            Console.ReadLine();        }    } } Are you targeting the 2.0 runtime from VS2008?  I wonder if the compiler in VS2005 won't support the new 3.0 language features even if they are valid for 2.0.

  • Anonymous
    November 16, 2007
    Actually, the C# version you wrote still will not compile because of that same error message.

  • Anonymous
    November 16, 2007
    This trick will only work with VS2008.  

  • Anonymous
    November 17, 2007
    扩展方法本质上只是一个编译器级别的语法糖, 但不引用.NET Framework 3.5的程序集却无法发布程序到2.0/3.0版本的运行环境中, 因为它将使那些方法(扩展方法)带上ExtensionAttribute属性, 而就是ExtensionAttribute这个类却存在于.NET Framework 3.5的程序集中. 其实只要使用一个小技巧即可以保证带有扩展方法的程序在Target到.NET Framework 2.0/3.0时通过编译...

  • Anonymous
    November 19, 2007
    I just installed framework 3.5 so i could play with linq but can not seem to get extension methords working in VS2005. MS you are a joke with you 3/3.5 framework and many developers think that V3.0 has linlq

  • Anonymous
    January 15, 2008
    A great new feature of Visual Studio 2008 is multi-targeting, which allows VS 2008 to compile for .NET