c# - 是否可以将泛型重载限制为属性类型?

标签 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

谢谢!

最佳答案

这将完成工作:

    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/

相关文章:

java - 返回子类类型的父类(super class)

c# - 为什么 Task 实现了 IAsyncResult,但不包含 AsyncWaitHandle 成员?

c# - 使用实体属性 (x.ID == 123) 创建表达式树 (Expression<Func<TEntity, bool>>)

.net - redirect_uri_mismatch错误Google API v3 .NET

.net - 需要用于全文搜索的数据库。 SQL 与 NoSQL?

Java 泛型 : solution of "Core Java" tutorial is not working on Eclipse?

c# - 保存百分比的类型

javascript - 为什么 Ajax 调用没有被命中?

c# - .NET 框架库中的 ref 关键字示例

generics - 如何为泛型类型编写扩展方法,其中一个类型变量必须是字符串?