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

本文关键字:属性 类型 重载 泛型 是否 | 更新日期: 2023-09-27 18:25:34

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

我有一些等级的

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重载可用,而不是双重重载

谢谢!

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

这将完成任务:

    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不是浮点。不允许使用此扩展进行隐式转换。