public static void RegisterRule <TType>(this AutoFaker <TType> faker, FakerRule <TType> fakerRule) where TType : class
        {
            //dynamically cast object to correct type
            var genericRuleType  = typeof(FakerRule <,>);
            var specificRuleType = genericRuleType.MakeGenericType(typeof(TType), fakerRule.PropertyType);
            var castMethod       = typeof(TemplateExtensions).GetMethod("Cast") !.MakeGenericMethod(new Type[] { specificRuleType });
            var castedObject     = castMethod.Invoke(null, new object[] { fakerRule });

            //dynamically call the RuleFor method on faker object
            var ruleForMethod = ReflectionHelper.GetMethod(faker.GetType(), "RuleFor", new Type[] { fakerRule.PropertyType },
                                                           new Type[] { ReflectionHelper.GetPropType(castedObject !, "Property"), ReflectionHelper.GetPropType(castedObject !, "Setter") });