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;
}
}
}
}
Compiling .NET 3.5 code to .NET 2.0 Works