Я сделал пару изменений, чтобы ваш код работал.
- Конструктор переменных изменен для использования перегрузки ActivityFunc
- Второй WriteLine должен явно вызывать ToString () в выражении
Исправленный кодвыглядит следующим образом
private static void Main(string[] args)
{
var testClass = new Test { MyString = "some string", MyBool = true };
var wf = new Sequence
{
Variables = {
// Changed to use ActivityFunc so testClass is not interpreted as a literal
new Variable<Test>("varName", ctx => testClass),
},
Activities =
{
new WriteLine
{
Text =
new VisualBasicValue<string>(
"\"Test Class Properties: \" & varName.MyString & \"-\" & varName.MyBool")
},
// Changed to call ToString explicitly
new WriteLine { Text = new VisualBasicValue<string>("\"Test Class ToString(): \" & varName.ToString()") }
}
};
var settings = new VisualBasicSettings();
settings.ImportReferences.Add(
new VisualBasicImportReference
{
Assembly = typeof(Test).Assembly.GetName().Name, Import = typeof(Test).Namespace
});
// construct workflow
VisualBasic.SetSettings(wf, settings);
WorkflowInvoker.Invoke(wf);
Console.ReadKey();
}
Еще одна вещь.Некоторые задаются вопросом, почему необходимо было явно вызывать Test.ToString () с оператором VB Concat.Это любопытная проблема, и это одно из мест, где тип, объявленный в C #, отличается от типа, объявленного в VB.
C # использует оператор + как для сложения, так и для объединения, где VB имеет оператор & для concatи конкретная инструкция IL op_Concat.
Если вы объявляете свой тип в VB, вы можете перегрузить оператор &, чтобы исключить необходимость вызова ToString () в вашем выражении.
Например
Public Class Test
Public Property MyString As String
Public Property MyBool As Boolean
Public Overrides Function ToString() As String
Return "Test Class : " & MyString + " - " & MyBool
End Function
Public Shared Operator &(ByVal left As String, ByVal right As Test) As String
Return left & "-" & right.ToString
End Operator
End Class
При работе с такими проблемами, как в VB, я часто просто создаю консольные приложения VB, чтобы протестировать их отдельно от Workflow
Module Module1
Dim varName As New Test With {.MyBool = True, .MyString = "some string"}
Sub Main()
Console.WriteLine("Test Class Properties: " & varName.MyString & "-" & varName.MyBool)
Console.WriteLine("Test Class ToString(): " & varName)
Console.ReadKey()
End Sub
End Module
IL, излучаемый для этого приложения, показывает оператора
IL_002f: ldstr "Test Class ToString(): "
IL_0034: ldsfld class VBTest.Test VBTest.Module1::varName
IL_0039: call string VBTest.Test::op_Concatenate(string, class VBTest.Test)
IL_003e: call void [mscorlib]System.Console::WriteLine(string)