我正在尝试在 NativeActivity 中使用自定义 c# 表达式
它适用于简单的表达式,如Condition = new CSharpValue("1 == 1")
它不适用于此类表达式Condition = new CSharpValue("Address == null")
由于表达式编译错误“当前上下文中不存在名称‘xxxxx’”,我无法在表达式中引用活动的变量或 InArgument
工作代码
var act = new ExecuteIfTrue
{
Condition = new CSharpValue<Boolean>("1 == 1"),
Address = new InArgument<MailAddress>(ctx => new MailAddress { DisplayName = "TestDisplayName" }),
Body = new WriteLine { Text = "Rest!" }
};
CompileCSharpExpressions<MailAddress>(act);
WorkflowInvoker.Invoke(act);
Non-Working 代码(参考 NativeActivity 的 InArgument)
var act = new ExecuteIfTrue
{
Condition = new CSharpValue<Boolean>("Address.Email == null"),
//Condition = new CSharpValue<Boolean>("MailAddressVar == null"),
Address = new InArgument<MailAddress>(ctx => new MailAddress { DisplayName = "TestDisplayName" }),
Body = new WriteLine { Text = "Rest!" }
};
CompileCSharpExpressions<MailAddress>(act);
WorkflowInvoker.Invoke(act);
NativeActivity
public class ExecuteIfTrue : NativeActivity
{
[RequiredArgument]
public InArgument<bool> Condition { get; set; }
[RequiredArgument]
public InArgument<MailAddress> Address { get; set; }
public Variable<MailAddress> MailAddressVar;
public Activity Body { get; set; }
public ExecuteIfTrue()
{
MailAddressVar = new Variable<MailAddress> { Default = null };
}
protected override void Execute(NativeActivityContext context)
{
if (context.GetValue(this.Condition) && this.Body != null)
context.ScheduleActivity(this.Body);
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
metadata.AddImplementationVariable(MailAddressVar);
base.CacheMetadata(metadata);
}
}
public class MailAddress
{
public String Email { get; set; }
public String DisplayName { get; set; }
}
辅助方法
public static void CompileCSharpExpressions<T>(Activity activity)
{
var impl = new AttachableMemberIdentifier(typeof(TextExpression), "NamespacesForImplementation");
var namespaces = new List<string> { typeof(T).Namespace };
TextExpression.SetReferencesForImplementation(activity, new AssemblyReference { Assembly = typeof(T).Assembly });
AttachablePropertyServices.SetProperty(activity, impl, namespaces);
var activityName = activity.GetType().ToString();
var activityType = activityName.Split('.').Last() + "_CompiledExpressionRoot";
var activityNamespace = string.Join(".", activityName.Split('.').Reverse().Skip(1).Reverse());
var settings = new TextExpressionCompilerSettings
{
Activity = activity,
Language = "C#",
ActivityName = activityType,
ActivityNamespace = activityNamespace,
RootNamespace = null,
GenerateAsPartialClass = false,
AlwaysGenerateSource = true,
ForImplementation = false
};
var results = new TextExpressionCompiler(settings).Compile();
if (results.HasErrors)
{
throw new Exception("Compilation failed.");
}
var compiledExpressionRoot = Activator.CreateInstance(results.ResultType, new object[] { activity }) as ICompiledExpressionRoot;
CompiledExpressionInvoker.SetCompiledExpressionRoot(activity, compiledExpressionRoot);
}