Jaunais {dinamiskais} vilnis

Paturpinot jaunā viļņa sērijas, šoreiz stāsts par dynamic keyword.

Kā Heljberga kungs PDC konferencē stāstīja, tad C# 4.0 ievērojamākais pievedums ir "Dynamic Programming", kas dod iespēju savienot CLR (Common Language Runtime) and DLR (Dynamic Language Runtime). Izsaukums no C# uz IronRuby vai otrādāk vairs nesagādās nekādas problēmas, kā arī ievērojami atvieglos darbu ar Reflection vārdu telpu, ar ko līdz šim bija jāstrādā.

Lai nodemostrētu dynamic keyworda spēku, pieņemsim, ka ir metode, kas akceptē kaut kādu objektu, kuram tā izsauc Validate() metodi.

Līdz šim bija jārikojās apmēram šādi:

 

static bool ValidateClientReflection(object client)
{
Type t = client.GetType();
return Convert.ToBoolean(
t.InvokeMember("Validate", System.Reflection.BindingFlags.InvokeMethod, null, client, null));
}

 

Ar jauno atslēgvārdu metodes realizāciju būtu šāda:

 

static bool ValidateClient(dynamic client)
{
return client.Validate();
}

 

Kas nozīmē, ka client parametrs tiek statiski definēts kā dinamisks :) un metodes vai property vai cita veida piekļuve attiecīgajam objektam tiek realizēta izpildes laikā.

 

public class CustomerSingle
{
public bool Validate()
{
return true;
}
}

public class CustomerOther
{
public bool Validate()
{
return false;
}
}

class Program
{
static void Main(string[] args)
{
Console.WriteLine("CustomerSingle.Validate() - " + ValidateClient(new CustomerSingle()));
Console.WriteLine("CustomerOther.Validate() - " + ValidateClient(new CustomerOther()));
Console.WriteLine("ValidateClientReflection() - " + ValidateClientReflection(new CustomerSingle()));
}


static bool ValidateClient(dynamic client)
{
return client.Validate();
}

static bool ValidateClientReflection(object client)
{
Type t = client.GetType();
return Convert.ToBoolean(t.InvokeMember("Validate", System.Reflection.BindingFlags.InvokeMethod, null, client, null));
}
}

 

Un rezultāts programmas izpildei ir sekojošs:

 

 

 

Jauki, vairs nebūs jākrāmējas ar Reflection vārdu telpu situācijās, kad tas bija nepieciešmas klases memberu pieejai, Relfection vārdu telpa noteikti anyway tiks pielietota, piemēram, dinamiski asemblija ielādei :)

 

 

Cerams, ka noderēs!

Published Monday, November 10, 2008 12:51 PM by valdis.iljuconoks

Comments

# re: Jaunais {dinamiskais} vilnis

Good point. I hadn't tohuhgt about it quite that way. :)

Wednesday, October 05, 2011 2:12 PM by Keisha

Leave a Comment

(obligāts) 
(obligāts) 
(brīvizvēles)
(obligāts)