是否可以将泛型过载限制为属性类型?

时间:2013-07-31 10:46:15

标签: c# .net generics expression

问题是我可以以某种方式严格限制泛型过载属性类型.. 现在还不清楚,所以这里有一个例子:

我有一些课

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

谢谢!

1 个答案:

答案 0 :(得分:0)

这将完成这项工作:

    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 。使用此扩展程序不允许隐式转换。

相关问题