如何更改泛型方法中从哪个参数推断出的类型?
How to change from which argument is the type inferred in generic methods?
假设我的 Utils class 中有一个静态方法,它设置 属性.
的值
public static SetPropertyValue<TDest, TVal>
(Expression<Func<TDest, TVal>> expression,
TDest destination,
TVal value)
{
// ...
}
另外还有一个class:
public class DataObject { public short Code { get; set; } }
以及使用代码:
DataObject obj = new DataObject();
int code = 404;
Utils.SetPropertyValue(m => m.Code, obj, code);
当上述代码为运行时,表达式变为m => Convert(m.Code)
,因为给定的第三个参数是一个整数并且表达式需要短。这意味着类型推断系统决定更喜欢第三个参数来确定 TVal
类型。
我希望此方法的第三个参数(值) 限制为第一个参数(表达式) 定义的类型。这可能吗?如果是,如何?
不,你不能那样影响类型推断 - 如果它 did 推断 TVal
为 short
,你的代码将无法编译,因为没有从 int
到 short
.
的隐式转换
当然,最好的解决方案就是避免使用两种不同的类型开始:
short code = 404;
Utils.SetPropertyValue(m => m.Code, obj, code);
现在可以正确推断类型,不会有任何转换。
假设我的 Utils class 中有一个静态方法,它设置 属性.
的值public static SetPropertyValue<TDest, TVal>
(Expression<Func<TDest, TVal>> expression,
TDest destination,
TVal value)
{
// ...
}
另外还有一个class:
public class DataObject { public short Code { get; set; } }
以及使用代码:
DataObject obj = new DataObject();
int code = 404;
Utils.SetPropertyValue(m => m.Code, obj, code);
当上述代码为运行时,表达式变为m => Convert(m.Code)
,因为给定的第三个参数是一个整数并且表达式需要短。这意味着类型推断系统决定更喜欢第三个参数来确定 TVal
类型。
我希望此方法的第三个参数(值) 限制为第一个参数(表达式) 定义的类型。这可能吗?如果是,如何?
不,你不能那样影响类型推断 - 如果它 did 推断 TVal
为 short
,你的代码将无法编译,因为没有从 int
到 short
.
当然,最好的解决方案就是避免使用两种不同的类型开始:
short code = 404;
Utils.SetPropertyValue(m => m.Code, obj, code);
现在可以正确推断类型,不会有任何转换。