【发布时间】:2013-07-31 20:28:23
【问题描述】:
问题是我能否以某种方式将泛型重载严格限制为属性类型.. 现在还不清楚,举个例子:
我有一些课
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) 不可用。有可能吗?
换句话说: 如果表达式中的属性类型是浮点数,我希望只有浮点重载可用,而不是双重重载
谢谢!
【问题讨论】:
-
你不能。您必须进行投射,例如:
o.Do(p => (double) p.WidthF, 100.9); -
@leppie 好像你说
o.Do(p => (float) p.WidthF, 100.9),因为会自动调用双重重载。 (100.9 字面量默认为双精度)。或者我们可以写o.Do(p => p.WidthF, 100.9F) -
您的问题是否仅限于 double/float 或者这是一个通用示例?
标签: c# .net generics expression