プロパティ(Id)に指定された属性(TV)が含まれていることをアサートする次の拡張メソッドがあります。
public static void ShouldHave<T, TV, TT>(this T obj, Expression<Func<T, TT>> exp) {...}
メソッドは次のように呼び出すことができます。
MyDto myDto = new MyDto();
myDto.ShouldHave<MyDto, RequiredAttribute, int>(x => x.Id);
うまくコンパイルされます。メソッド署名から T と TT を削除できるかどうか疑問に思っていました。T は T で ShouldHave が呼び出されるため、明示的に指定する必要がないからです。TT は、式 (x.Id) で参照されるプロパティの型です。