2009-02-18

Rolig dag på jobbet

I dagarna har jag vart lärare på AddSkills i kursen Visual Studio 2008 Windows Workflow Foundation.
På denna kurs finns en kollega vid namn Peter Ilis som visat sig vara en klurig kille. När jag gick igenom hur nya instanser av workflows får sina initiala värden så kom frågan om det inte fanns något enkelt sätt att göra detta hårt typat.

Problemet är alltså att den vanliga metoden att skapa nya instanser tar en Dictionary<string, object> som argument och det vanliga sättet att fylla den med data är via medföljande Add-metod. Här har vi alltså ingen validering att vi har rätt namn på våra properties och inte heller vet vi att vi använder rätt datatyp.. snyggt, njae

Tänk er ett workflow med två properties:
public class MyWorkflow
{
public string Name { get; set; }
public int Age{ get; set; }
}

Du vill sedan få möjligheten att skapa en dictionary som har hård typning och som vet vilka properties du har exponerat i ditt workflow. Exempelvis på följande sätt:
var d = new PropertyDictionary<MyWorkflow>();
d.Add(o => o.Age, 30)
.Add(o=> o.Name, "John Doe");

Hur går denna magi till? Tja, det är rätt enkelt egentligen och här är lösningen som Peter skapade grunden till och som jag trixade vidare lite med.


public class PropertyDictionary<TWorkflowType> : Dictionary<string, object>
{
public virtual PropertyDictionary<TWorkflowType> Add<TType>(Expression<Func<TWorkflowType, TType>> key, TType value)
{
Add(GetPropertyName(key), value);
return this;
}

    private string GetPropertyName<TType>(Expression<Func<TWorkflowType, TType>> propertyExpression)
{
MemberExpression expressionBody = (MemberExpression)propertyExpression.Body;
return expressionBody.Member.Name;
}
}




Kör så det ryker, jag tycker detta är grymt coolt!

Inga kommentarer: