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") });