问题是我能否以某种方式将泛型重载严格限制为属性类型.. 现在还不清楚,所以这里有一个例子:
我有课
public class Obj
{
public double Width { get; set; }
public float WidthF { get; set; }
}
和它的一些扩展
public static class TestGenericOverride
{
public static void Do<TObj, TProp>(this TObj src,
Expression<Func<TObj, TProp>> expr, TProp val)
{
Console.WriteLine("Do: typeof(TProp) = {0}", typeof(TProp).Name);
}
}
这是主要的
static void Main(string[] args)
{
var o = new Obj();
o.Do(p => p.Width, 100); //1: typeof(TProp) = Double
o.Do(p => p.Width, 100.0); //2: typeof(TProp) = Double
o.Do(p => p.WidthF, 100); //3: typeof(TProp) = Single
o.Do(p => p.WidthF, 100.9); //4: typeof(TProp) = Double
Console.ReadLine();
}
我想要的是让最后一次通话 (#4) 不可用。可能吗?
换句话说: 如果表达式中的属性类型是 float,我希望只有 float-overload 可用,而不是 double-overload
谢谢!
最佳答案
这将完成工作:
public static void Do<TObj, TProp, TValue>(this TObj src,
Expression<Func<TObj, TProp>> expr, TValue val) where TValue: TProp
{
Console.WriteLine("Do: typeof(TProp) = {0}", typeof(TProp).Name);
}
新的值需要与属性的类型相同。这意味着不仅 #4 不起作用,而且 #1 和 #3 也不起作用,因为 int 不是 float。不允许使用此扩展进行隐式转换。
关于c# - 是否可以将泛型重载限制为属性类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17968254/