Ekspresi (WF)

Ekspresi Windows Workflow Foundation (WF) adalah aktivitas apa pun yang mengembalikan hasil. Semua aktivitas ekspresi berasal secara tidak langsung dari Activity<TResult>, yang berisi sebagai properti OutArgument yang bernama Result sebagai nilai pengembalian dari aktivitas. WF dikirim dengan berbagai aktivitas ekspresi dari yang sederhana seperti VariableValue<T> dan VariableReference<T>, yang menyediakan akses ke variabel alur kerja tunggal melalui aktivitas operator, hingga aktivitas kompleks seperti VisualBasicReference<TResult> dan VisualBasicValue<TResult> yang menawarkan akses ke luasnya bahasa Visual Basic untuk menghasilkan hasilnya. Aktivitas ekspresi tambahan dapat dibuat dengan berasal dari CodeActivity<TResult> atau NativeActivity<TResult>.

Menggunakan Ekspresi

Perancang alur kerja menggunakan VisualBasicValue<TResult> dan VisualBasicReference<TResult> untuk semua ekspresi dalam proyek Visual Basic, dan CSharpValue<TResult> dan CSharpReference<TResult> untuk ekspresi dalam proyek alur kerja C#.

Nota

Dukungan untuk ekspresi C# dalam proyek alur kerja diperkenalkan dalam .NET Framework 4.5. Untuk informasi selengkapnya, lihat Ekspresi C#.

Alur kerja yang dihasilkan oleh perancang disimpan di XAML, di mana ekspresi tampak diapit dalam tanda kurung siku, seperti dalam contoh berikut.

<Sequence xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Sequence.Variables>
    <Variable x:TypeArguments="x:Int32" Default="1" Name="a" />
    <Variable x:TypeArguments="x:Int32" Default="2" Name="b" />
    <Variable x:TypeArguments="x:Int32" Default="3" Name="c" />
    <Variable x:TypeArguments="x:Int32" Default="0" Name="r" />
  </Sequence.Variables>
  <Assign>
    <Assign.To>
      <OutArgument x:TypeArguments="x:Int32">[r]</OutArgument>
    </Assign.To>
    <Assign.Value>
      <InArgument x:TypeArguments="x:Int32">[a + b + c]</InArgument>
    </Assign.Value>
  </Assign>
</Sequence>

Saat menentukan alur kerja dalam kode, aktivitas ekspresi apa pun dapat digunakan. Contoh berikut menunjukkan penggunaan komposisi aktivitas operator untuk menambahkan tiga angka:

Variable<int> a = new Variable<int>("a", 1);
Variable<int> b = new Variable<int>("b", 2);
Variable<int> c = new Variable<int>("c", 3);
Variable<int> r = new Variable<int>("r", 0);

Sequence w = new Sequence
{
    Variables = { a, b, c, r },
    Activities =
    {
        new Assign {
            To = new OutArgument<int>(r),
            Value = new InArgument<int> {
                Expression = new Add<int, int, int> {
                    Left = new Add<int, int, int> {
                        Left = new InArgument<int>(a),
                        Right = new InArgument<int>(b)
                    },
                    Right = new InArgument<int>(c)
                }
            }
        }
    }
};

Alur kerja yang sama dapat diekspresikan dengan lebih ringkas dengan menggunakan ekspresi C# lambda, seperti yang ditunjukkan dalam contoh berikut:

Variable<int> a = new Variable<int>("a", 1);
Variable<int> b = new Variable<int>("b", 2);
Variable<int> c = new Variable<int>("c", 3);
Variable<int> r = new Variable<int>("r", 0);

Sequence w = new Sequence
{
    Variables = { a, b, c, r },
    Activities =
    {
        new Assign {
            To = new OutArgument<int>(r),
            Value = new InArgument<int>((ctx) => a.Get(ctx) + b.Get(ctx) + c.Get(ctx))
        }
    }
};

Memperluas Ekspresi yang Tersedia dengan Aktivitas Ekspresi Kustom

Ekspresi dalam .NET Framework 4.6.1 dapat diperluas yang memungkinkan aktivitas ekspresi tambahan dibuat. Contoh berikut menunjukkan aktivitas yang mengembalikan jumlah tiga nilai bilangan bulat.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;

namespace ExpressionsDemo
{
    public sealed class AddThreeValues : CodeActivity<int>
    {
        public InArgument<int> Value1 { get; set; }
        public InArgument<int> Value2 { get; set; }
        public InArgument<int> Value3 { get; set; }

        protected override int Execute(CodeActivityContext context)
        {
            return Value1.Get(context) +
                   Value2.Get(context) +
                   Value3.Get(context);
        }
    }
}

Dengan aktivitas baru ini, Anda dapat menulis ulang alur kerja sebelumnya yang menambahkan tiga nilai seperti yang ditunjukkan dalam contoh berikut:

Variable<int> a = new Variable<int>("a", 1);
Variable<int> b = new Variable<int>("b", 2);
Variable<int> c = new Variable<int>("c", 3);
Variable<int> r = new Variable<int>("r", 0);

Sequence w = new Sequence
{
    Variables = { a, b, c, r },
    Activities =
    {
        new Assign {
            To = new OutArgument<int>(r),
            Value = new InArgument<int> {
                Expression = new AddThreeValues() {
                    Value1 = new InArgument<int>(a),
                    Value2 = new InArgument<int>(b),
                    Value3 = new InArgument<int>(c)
                }
            }
        }
    }
};

Untuk informasi selengkapnya tentang menggunakan ekspresi dalam kode, lihat Penulisan Alur Kerja, Aktivitas, dan Ekspresi Menggunakan Kode Imperatif.