避免使用通用参数

| 我有以下扩展方法,该方法断言属性(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)中引用的属性的类型。     
已邀请:
        类型参数的自动推断仅在方法调用中未指定泛型参数的情况下有效。即:
myDto.ShouldHave<, RequiredAttribute, >(x => x.Id);
是无效的语法。您可以拥有“全有或全无”。 因此,如果要推断
T
TT
,则需要以其他方式传递
TV
中当前包含的信息。例如,一种选择是将属性的类型作为参数传递:
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));
    
        编译如下:
public static void ShouldHave<T, TT>(this T obj, Expression<Func<T, TT>> exp)
{...}

MyDto myDto = new MyDto();
myDto.ShouldHave(x => x.Id);
这省略了“ 5”类型参数,这就是您需要在调用站点上显式指定通用参数的原因。如果您需要此参数,那么您就不走运了。     
        尝试这个:
public static void ShouldHave<TV>(this object obj, Expression<Func<object, object>> exp) {...}
您应该发现ѭ11现在由包围对象的实数表达式组成。在您的方法内部,按如下所示剥离演员表:
Expression realExp = ((UnaryExpression) exp).Operand;
然后,您可以开始分析表达式。但是,与原始方法相比,您将需要执行更多的运行时测试和安全检查。     

要回复问题请先登录注册