Как создать новый InArgument <T>, где T можно динамически менять - PullRequest
0 голосов
/ 24 ноября 2011

В rehost WorkflowDesigner я хочу присвоить InArguments действительное значение с помощью следующего кода:

 Type inActivityType = leftActivity.GetType();
 PropertyInfo inPropInfo = inActivityType.GetProperty(inArgumentName);
 InPropInfo.SetValue(leftActivity, 
                     new InArgument<someType>(new VisualBasicValue<someType>(variableName)), 
                     null);

Поскольку «someType» динамически назначается другому типу, обычный способ создания нового InArgument будетне работает.Одна идея, которую я нашел:

//  Type theType - the value of theType will be assigned dynamicly, 
//  base on different InArgument be selected

 Type InArgType = typeof(InArgument<>).MakeGenericType(new[] { theType });
 object InArg = Activator.CreateInstance(InArgType);
.  .  .
  InPropInfo.SetValue(leftActivity, 
                     InArg, 
                     null);

Но проблема в том, что я могу только создать новый InArgument, но не могу назначить ему новое VisualBasicValue (variableName).

Спасибо за любую идею.

1 Ответ

1 голос
/ 24 ноября 2011

Вы также можете использовать этот трюк для создания нового экземпляра VisualBasicValue и передать его InArgument, используя перегрузку CreateInstance, которая принимает аргументы конструктора. Возможно, что-то вроде этого:

Type InArgType = typeof(InArgument<>).MakeGenericType(new[] { theType });
Type vbValueType = typeof (VisualBasicValue<>).MakeGenericType(new[] {theType});
object vbValue = Activator.CreateInstance(vbValueType, variableName);
object InArg = Activator.CreateInstance(InArgType, vbValue); 

Однако, в зависимости от того, что вы пытаетесь сделать, вы можете просто использовать неуниверсальный InArgument и не беспокоиться о дженериках там.

...