在最新的Windows Workflow Fonudation(WF4, 下文中将简称WF4)中,WF中引入了VB expression,用户可以通过vb表达式为变量赋值。有兴趣的朋友可以安装VS 2010,然后使用一下这个功能。关于这个功能的参考,请看:http://msdn.microsoft.com/en-us/library/ee342461.aspx 什么? 不知道啥是WF,哦,幸亏你遇到我,让我来告诉你。有两个解决办法:1. 直接不要看这篇文章了。2. 回去看4个小时WF的文章,先入个门。
看完本文,将给你一个解决方案,就是用户可以通过自己写的expression得到想要的结果。这个expression是相对复杂的。那就是可以是任意的vb表达式。请注意,是表达式,想用什么while写大段代码的请绕路。
废话不说,先说说我的思路,就是当我发现这个WF4的方法后,有了一个想法,就是能不能把这个expression用到我们的普通工程中去。可以实现用户通过expression对输出结果的控制。这样对于用户有复杂需求和需要复杂报表的项目有很大的帮助。有点类似Excel中的expression。但WF4中的expression应该更加强大一点。支持类和类的属性。
下面看代码:
1. 新建一个FakeCodeActivity 类,继承自CodeActivity。用这个类来处理传入的expression。
class FakeCodeActivity<T> : CodeActivity
{
// Define an activity input argument of type string
public InArgument<T> Expression { get; set; }
public T Value { get ; private set ;}
// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
protected override void Execute(CodeActivityContext context)
{
// Obtain the runtime value of the Text input argument
Value = (T)context.GetValue(
this.Expression);
}
}
2. 写了一个静态函数来实现功能。
// Evaluate<Class1, int>("x.A + x.B", "x", x);
public static T Evaluate<S, T>(string expression, string varName, S obj)
{
string assemblyname = typeof (S).Assembly.GetName().Name;
string ns = typeof (S).Namespace;
VisualBasicSettings vbSettings = new VisualBasicSettings ();
vbSettings.ImportReferences.Add(
new VisualBasicImportReference{Assembly = assemblyname,Import = ns,});
FakeCodeActivity<T> fakeActivity = new FakeCodeActivity<T> { Expression = new VisualBasicValue<T>(expression)};
Sequence wf = new Sequence
{
Variables =
{
new Variable<S> {Name = varName, Default = obj}
},
Activities = { fakeActivity}
};
// Add settings to the activity that you want.
VisualBasic.SetSettings(wf, vbSettings);
//Invoke workflow
try
{
WorkflowInvoker.Invoke(wf);
}
catch(InvalidWorkflowException se)
{
string errorMessage = se.Message;
throw new SystemException(errorMessage);
}
return fakeActivity.Value;
}
这样,这个函数就可以处理expression了。不但是数学表达式,还可以是类属性的表达式。举几个例子:
1. Expression: 3+8
2. Expression: test.FirstName+test.LastName
ObjectName: test
不能上图真是不方便。