Compiling .NET 3.5 code to .NET 2.0 Works
This is something that is totally cool. You can use Visual Studio 2008 and a lot of the new functionality and cross compile it to .NET 2.0 and run it on the older framework. For Example, You can use Var objects, Simple Property Declarations, Property Constructors, Lambda expressions
Here's an example program that can be compiled with VS 2008 to the .NET 2.0 framework
static class Program { private class Client { public string Name { get; set; } public string Address { get; set; } } private static List<Client> clients = new List<Client> { new Client() {Name = "Name1", Address = "Address1" }, new Client() {Name = "Name2", Address = "Address2" }, new Client() {Name = "Name3", Address = "Address3" }, new Client() {Name = "Name13", Address = "Address13" }, new Client() {Name = "Name123", Address = "Address123" } }; [STAThread] static void Main() { List<Client> ClientsWith1 = clients.FindAll(c => c.Name.Contains("1")); ClientsWith1.ForEach(c => { var NewClient = new { Name = c.Name, Address = c.Address }; Console.WriteLine(NewClient.ToString()); }); Console.ReadKey(); } }
Here's the output
{ Name = Name1, Address = Address1 }
{ Name = Name13, Address = Address13 }
{ Name = Name123, Address = Address123 }
And it works without .NET 3.5 installed.
For those interested, Here's a Reflected code
internal static class Program { // Fields private static List<Client> clients; [CompilerGenerated] private static Predicate<Client> CS$<>9__CachedAnonymousMethodDelegate2; [CompilerGenerated] private static Action<Client> CS$<>9__CachedAnonymousMethodDelegate3; // Methods static Program() { List<Client> <>g__initLocal4 = new List<Client>(); Client <>g__initLocal5 = new Client(); <>g__initLocal5.Name = "Name1"; <>g__initLocal5.Address = "Address1"; <>g__initLocal4.Add(<>g__initLocal5); Client <>g__initLocal6 = new Client(); <>g__initLocal6.Name = "Name2"; <>g__initLocal6.Address = "Address2"; <>g__initLocal4.Add(<>g__initLocal6); Client <>g__initLocal7 = new Client(); <>g__initLocal7.Name = "Name3"; <>g__initLocal7.Address = "Address3"; <>g__initLocal4.Add(<>g__initLocal7); Client <>g__initLocal8 = new Client(); <>g__initLocal8.Name = "Name13"; <>g__initLocal8.Address = "Address13"; <>g__initLocal4.Add(<>g__initLocal8); Client <>g__initLocal9 = new Client(); <>g__initLocal9.Name = "Name123"; <>g__initLocal9.Address = "Address123"; <>g__initLocal4.Add(<>g__initLocal9); clients = <>g__initLocal4; } [STAThread] private static void Main() { if (CS$<>9__CachedAnonymousMethodDelegate2 == null) { CS$<>9__CachedAnonymousMethodDelegate2 = delegate (Client c) { return c.Name.Contains("1"); }; } if (CS$<>9__CachedAnonymousMethodDelegate3 == null) { CS$<>9__CachedAnonymousMethodDelegate3 = delegate (Client c) { Console.WriteLine(new { Name = c.Name, Address = c.Address }.ToString()); }; } clients.FindAll(CS$<>9__CachedAnonymousMethodDelegate2).ForEach(CS$<>9__CachedAnonymousMethodDelegate3); Console.ReadKey(); } // Nested Types private class Client { // Fields [CompilerGenerated] private string <Address>k__BackingField; [CompilerGenerated] private string <Name>k__BackingField; // Properties public string Address { [CompilerGenerated] get { return this.<Address>k__BackingField; } [CompilerGenerated] set { this.<Address>k__BackingField = value; } } public string Name { [CompilerGenerated] get { return this.<Name>k__BackingField; } [CompilerGenerated] set { this.<Name>k__BackingField = value; } } } }
1 comment:
Great work.
Post a Comment