VS2012 / .NET 4.5を使用して、(実装の子として)子の受信アクティビティを実装するカスタムアクティビティを作成しています。以下の例では、パラメーターは1つだけに固定されています。Guid型のOutValue。
アクティビティから返す前に、ReceiveDoneを操作して変換する必要があるため、ReceiveDoneの受信パラメーター値の値にアクセスしたいと思います。現在Guidを使用していることを無視してください。それでも、InvalidOperationExceptionを使用して値にアクセスできません。
アクティビティは、所有する引数の場所のみを取得できます。アクティビティ'TestActivity'は、アクティビティ'Wait for Workflow Start Request [InternalforTestActivity]'が所有する引数'OutValue'の場所を取得しようとしています。
思いつく限りのことをやってみましたが、うんざりしています。この非常に単純なことを行う方法があるに違いありませんか?
public class TestActivity : NativeActivity<Guid>
{
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
var content = ReceiveParametersContent.Create(new Dictionary<string, OutArgument>()
{
// How to access the runtime value of this inside TestActivity?
{"OutValue", new OutArgument<Guid>()}
});
startReceiver = new Receive()
{
DisplayName = string.Format("Wait for workflow start request [Internal for {0}]", this.DisplayName),
CanCreateInstance = true,
ServiceContractName = XName.Get("IStartService", Namespace),
OperationName = "Start",
Content = content
};
foreach (KeyValuePair<string, OutArgument> keyValuePair in content.Parameters)
{
metadata.AddImportedChild(keyValuePair.Value.Expression);
}
metadata.AddImplementationChild(startReceiver);
}
protected override void Execute(NativeActivityContext context)
{
context.ScheduleActivity(startReceiver, ReceiveDone);
}
private void ReceiveDone(NativeActivityContext context, ActivityInstance completedInstance)
{
var receive = completedInstance.Activity as Receive;
ReceiveParametersContent content = receive.Content as ReceiveParametersContent;
try
{
// This causes InvalidOperationException.
// An Activity can only get the location of arguments which it owns.
// Activity 'TestActivity' is trying to get the location of argument 'OutValue'
// which is owned by activity 'Wait for workflow start request [Internal for TestActivity]'
var parmValue = content.Parameters["OutValue"].Get(context);
}
catch (Exception)
{ }
}
private Receive startReceiver;
private const string Namespace = "http://company.namespace";
}