VB 表达式在.net WF 4.0中的用法

在最新的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

 

 

不能上图真是不方便。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值