Advertisement
Guest User

Untitled

a guest
Feb 21st, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. public static IEvent ResolveEvent(this Dictionary<string, object> input, Type type)
  2. {
  3. var constructor = GetConstructor(type);
  4. var constructorParameters = GetConstructorParameters(constructor);
  5. var mappedParameters = MapParametersFromDictionary(constructorParameters, input);
  6. return CreateInstance(mappedParameters, constructor);
  7. }
  8.  
  9. private static ConstructorInfo GetConstructor(Type type)
  10. {
  11. //this is safe because we know events only have (or should have) one constructor
  12. var ctor = type.GetConstructors().FirstOrDefault();
  13. if (ctor == null)
  14. {
  15. throw new Exception("No Constructor Found");
  16. }
  17. return ctor;
  18. }
  19. private static ParameterInfo[] GetConstructorParameters(ConstructorInfo info)
  20. {
  21. return info.GetParameters();
  22. }
  23.  
  24. private static object[] MapParametersFromDictionary(ParameterInfo[] constructorParams, Dictionary<string, object> input)
  25. {
  26. if (constructorParams.Length != input.Count)
  27. {
  28. throw new Exception("Not Enough Parameters");
  29. }
  30. var paramters = new object[constructorParams.Length];
  31. foreach (var param in constructorParams)
  32. {
  33. var inputParam = input.FirstOrDefault(x => string.Equals(x.Key, param.Name, StringComparison.CurrentCultureIgnoreCase));
  34. if (inputParam.Equals(null))
  35. {
  36. throw new Exception("Parameter Doesnt Exist");
  37. }
  38. if (typeof(IConvertible).IsAssignableFrom(param.ParameterType))
  39. {
  40. paramters[param.Position] = Convert.ChangeType(inputParam.Value, param.ParameterType);
  41. }
  42. else
  43. {
  44. paramters[param.Position] = inputParam.Value;
  45. }
  46. }
  47. return paramters;
  48. }
  49.  
  50. private static IEvent CreateInstance(object[] parameters, ConstructorInfo info)
  51. {
  52. return info.Invoke(parameters) as IEvent;
  53. }
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement