[WF4] Instancier une Variable de type dynamique

Publié le 26 mars 2010 par Jeremy.jeanson

Encore une problématique de tordu : Vous êtes dans la phase de design de votre workflow et vous avez un scope de variables dans lequel vous devez ajouter une variable dont le type est connu uniquement au dernier moment.

Dans ce cas, vous avez déjà trouvé :

  • Un scope : une activité qui a un collection de variables (qui a donc un ModelItem).
  • Un type : qui doit être utilisé pour créer une variable.

Ce qui risque de vous bloquer, c'est que Variable est un type abstrait et qu'il n'a pas de méthode statique pour instancier des variables (cela aurait été bien vu, si Microsoft c'était lancé dans un petit pattern de fabrique). En fait ce problème est très simple, il faut reprendre un peu les base de .net 2. Créer un type générique Variable<T> et le passer à l'Activator.

Ce qui donne un code comme celui-ci (avec myType notre type défini dynamiquement, et scope notre Modelitem qui sert de scope)

Vb

Dim typeVariable As Type = GetType(Variable(Of))
Dim typeVariableT As Type = typeVariable.MakeGenericType(myType)

Dim myVariable As Object = Activator.CreateInstance(typeVariableT, "MyVariableName")
scope.Propertie("Variables").Collection.Add(myVariable)

C#

Type typeVariable = typeof(Variable<>); 
Type typeVariableT = typeVariable.MakeGenericType(myType); 

Object myVariable = Activator.CreateInstance(typeVariableT, "MyVariableName");
scope.Properties["Variables"].Collection.Add(myVariable);