Автоматический вывод аргументов типа работает только в том случае, если в вызове метода указаны нет универсальных аргументов. Т.е. это:
myDto.ShouldHave<, RequiredAttribute, >(x => x.Id);
недопустимый синтаксис. Вы можете иметь «все или ничего».
Таким образом, если вы хотите сделать вывод T
и TT
, вам нужно передать информацию, содержащуюся в TV
, как-то иначе. Например, одним из вариантов будет передача type атрибута в качестве параметра:
public static void ShouldHave<T, TT>(this T obj,
Expression<Func<T, TT>> exp,
Type attribute) {...}
(Очевидно, это потребует изменений в вашей реализации ShouldHave).
Тогда вы сможете вызывать метод следующим образом:
MyDto myDto = new MyDto();
myDto.ShouldHave(x => x.Id, typeof(RequiredAttribute));