private Action <TCase> GenerateSetter(AttributeSchema attributeSchema, AttributeDefinition attributeDefinition) { Func <Delegate, Action <TCase> > factory = SetterFactory <int>; var setter = DynamicCodeUtils.GenerateSetter <TCase>(attributeDefinition); return(DynamicCodeUtils.DelegateInvoke(factory, attributeDefinition.Type, setter, this)); Action <TCase> SetterFactory <T>(Delegate generatedSetter) { if (!(generatedSetter is Setter <TCase, T> setterDelegate)) { throw new InvalidOperationException("Encountered incorrect setter type."); } var getter = cursor.GetAttributeGetter <T>(attributeSchema); return(target => { T value = default; getter(ref value); setterDelegate(target, value); }); } }
private Action <TCase> GenerateIdSetter() { var setter = DynamicCodeUtils.GenerateSetter <TCase>(definition.IdAttribute); if (!(setter is Setter <TCase, string> setterDelegate)) { throw new InvalidOperationException("Encountered incorrect ID setter type."); } return(target => { var value = cursor.GetId(); setterDelegate(target, value); }); }
private Action <TCase> GenerateSolutionSetter() { Func <Delegate, Action <TCase> > factory = SetterFactory <int>; var setter = DynamicCodeUtils.GenerateSetter <TCase>(definition.SolutionAttribute); return(DynamicCodeUtils.DelegateInvoke(factory, definition.SolutionAttribute.Type, setter, this)); Action <TCase> SetterFactory <T>(Delegate generatedSetter) { if (!(generatedSetter is Setter <TCase, T> setterDelegate)) { throw new InvalidOperationException("Encountered incorrect solution setter type."); } return(target => { var value = cursor.GetSolution <T>(); setterDelegate(target, value); }); } }