3

问题是我能否以某种方式将泛型重载严格限制为属性类型。现在还不清楚,所以这里有一个例子:

我有一些课

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)不可用。可能吗?

换句话说:如果表达式中的属性类型是浮点数,我希望只有浮点重载可用,而不是双重重载

谢谢!

4

1 回答 1

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 也不起作用,因为 and int不是float。不允许使用此扩展进行隐式转换。

于 2013-08-10T13:14:23.857 回答