Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static IEvent ResolveEvent(this Dictionary<string, object> input, Type type)
- {
- var constructor = GetConstructor(type);
- var constructorParameters = GetConstructorParameters(constructor);
- var mappedParameters = MapParametersFromDictionary(constructorParameters, input);
- return CreateInstance(mappedParameters, constructor);
- }
- private static ConstructorInfo GetConstructor(Type type)
- {
- //this is safe because we know events only have (or should have) one constructor
- var ctor = type.GetConstructors().FirstOrDefault();
- if (ctor == null)
- {
- throw new Exception("No Constructor Found");
- }
- return ctor;
- }
- private static ParameterInfo[] GetConstructorParameters(ConstructorInfo info)
- {
- return info.GetParameters();
- }
- private static object[] MapParametersFromDictionary(ParameterInfo[] constructorParams, Dictionary<string, object> input)
- {
- if (constructorParams.Length != input.Count)
- {
- throw new Exception("Not Enough Parameters");
- }
- var paramters = new object[constructorParams.Length];
- foreach (var param in constructorParams)
- {
- var inputParam = input.FirstOrDefault(x => string.Equals(x.Key, param.Name, StringComparison.CurrentCultureIgnoreCase));
- if (inputParam.Equals(null))
- {
- throw new Exception("Parameter Doesnt Exist");
- }
- if (typeof(IConvertible).IsAssignableFrom(param.ParameterType))
- {
- paramters[param.Position] = Convert.ChangeType(inputParam.Value, param.ParameterType);
- }
- else
- {
- paramters[param.Position] = inputParam.Value;
- }
- }
- return paramters;
- }
- private static IEvent CreateInstance(object[] parameters, ConstructorInfo info)
- {
- return info.Invoke(parameters) as IEvent;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement