using Microsoft.Xrm.Sdk.Workflow;
namespace Xrm.F5D365CERecruitment.Solution.WFActivities
public class CalculateAge : CodeActivity
public ITracingService tracingService;
public IWorkflowContext wfcontext;
public IOrganizationServiceFactory serviceFactory;
public IOrganizationService service;
public InArgument<DateTime> DOB { get; set; }
[Input("DateTimeNowUTC")]
public InArgument<DateTime> DateTimeNowUTC { get; set;}
public OutArgument<double> Age { get; set; }
public OutArgument<DateTime> NextBirthday { get; set; }
protected override void Execute(CodeActivityContext context)
DateTime dob = DOB.Get(context);
DateTime dateTimeNowUTC = DateTimeNowUTC.Get(context);
public static void Main(){
var codeActivityContext = new CodeActivityContext();
var workflowInstance1 = new CalculateAge(){
DOB = new InArgument<DateTime>(new DateTime(1995,02,01)),
DateTimeNowUTC = new InArgument<DateTime>(new DateTime(2022,06,15)),
Age = new OutArgument<double>(),
NextBirthday = new OutArgument<DateTime>()
workflowInstance1.Execute(codeActivityContext);
if(workflowInstance1.Age.Get(codeActivityContext) != 27)
throw new Exception("[Test 1]: Expects an age of 27 for DOB 01/02/1995 and time 15/06/2022, got " + workflowInstance1.Age.Get(codeActivityContext));
if(workflowInstance1.NextBirthday.Get(codeActivityContext) != new DateTime(2023,2,1))
throw new Exception("[Test 2]: Expects a next birthday of 01/02/2023 for DOB 01/02/1995 and time 15/06/2022, got " + workflowInstance1.NextBirthday.Get(codeActivityContext));
var workflowInstance2 = new CalculateAge(){
DOB = new InArgument<DateTime>(new DateTime(1995,02,01)),
DateTimeNowUTC = new InArgument<DateTime>(new DateTime(2022,01,15)),
Age = new OutArgument<double>(),
NextBirthday = new OutArgument<DateTime>()
workflowInstance2.Execute(codeActivityContext);
if(workflowInstance2.Age.Get(codeActivityContext) != 26)
throw new Exception("[Test 3]: Expects an age of 26 for DOB 01/02/1995 and time 15/01/2022, got " + workflowInstance2.Age.Get(codeActivityContext));
if(workflowInstance2.NextBirthday.Get(codeActivityContext) != new DateTime(2022,2,1))
throw new Exception("[Test 4]: Expects a next birthday of 01/02/2022 for DOB 01/02/1995 and time 15/06/2022, got " + workflowInstance2.NextBirthday.Get(codeActivityContext));
var workflowInstance3 = new CalculateAge(){
DOB = new InArgument<DateTime>(new DateTime(2022,02,01)),
DateTimeNowUTC = new InArgument<DateTime>(new DateTime(2022,01,15)),
Age = new OutArgument<double>(),
NextBirthday = new OutArgument<DateTime>()
workflowInstance3.Execute(codeActivityContext);
if(workflowInstance3.Age.Get(codeActivityContext) != 0)
throw new Exception("[Test 5]: Expects an age of 0 for DOB 01/02/2022 and time 15/01/2022, got " + workflowInstance3.Age.Get(codeActivityContext));
if(workflowInstance3.NextBirthday.Get(codeActivityContext) != new DateTime(2022,2,1))
throw new Exception("[Test 6]: Expects a next birthday of 01/02/2022 for DOB 01/02/2022 and time 15/06/2022, got " + workflowInstance3.NextBirthday.Get(codeActivityContext));
namespace System.Activities
public sealed class InArgument<T>
public InArgument(T constValue){
public InArgument(Activity<T> expression){}
public T Get(ActivityContext context){ return val;}
public sealed class OutArgument<T>
public OutArgument(T constValue){}
public OutArgument(Activity<T> expression){}
public void Set(ActivityContext context, T value){
public T Get(ActivityContext context){
public sealed class RequiredArgumentAttribute : Attribute
public RequiredArgumentAttribute(){}
public abstract class CodeActivity : Activity
protected CodeActivity(){}
protected abstract void Execute(CodeActivityContext context);
public class Activity<T>: Activity{
public class CodeActivityContext : ActivityContext
public class ActivityContext{
public T GetExtension<T>() where T : class{