Skip to content

Instantly share code, notes, and snippets.

@codescribler
Created June 20, 2012 08:44
Show Gist options
  • Save codescribler/2958848 to your computer and use it in GitHub Desktop.
Save codescribler/2958848 to your computer and use it in GitHub Desktop.
Makes an event from the provided command - see gregory young's stuff on CQRS
protected TE MakeEvent<TE>(Command command)
where TE : Event
{
return MakeEvent<TE>(command, new List<object>());
}
private TE MakeEvent<TE>(Command command, IEnumerable<object> additionalParams)
where TE : Event
{
var type = typeof(TE);
ConstructorInfo constructorInfo = type.GetConstructors().Where(t => t.GetParameters().Any()).ToList().SingleOrDefault();
if (constructorInfo == null) return Activator.CreateInstance<TE>();
List<string> ctrVariableNames = constructorInfo.GetParameters().Select(p => p.Name).ToList();
var commandType = command.GetType();
var commandFields = commandType.GetFields();
var fieldInfos = commandFields.Where(f => ctrVariableNames.Contains(ToCamelCase(f.Name)));
List<object> parameters = fieldInfos.Select(fieldInfo => fieldInfo.GetValue(command)).ToList();
parameters.AddRange(additionalParams);
return (TE)Activator.CreateInstance(type, parameters.ToArray());
}
private string ToCamelCase(string text)
{
var firstCharacter = text[0].ToString().ToLower();
return firstCharacter + text.Substring(1, text.Length - 1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment