代码之家  ›  专栏  ›  技术社区  ›  TheCloudlessSky

静态方法/调用方的类类型推断?

  •  0
  • TheCloudlessSky  · 技术社区  · 14 年前

    给定以下两类:

    public class ABC
    {
        public void Accept(Ordering<User> xyz)
        {
            // Do stuff with xyz...
        }
    }
    
    public class Ordering<TEntity>
            where TEntity : class
    {
        private readonly Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> Transform;
    
        private Ordering(Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> transform)
        {
            this.Transform = transform;
        }
    
        public static Ordering<TEntity> By<TKey>(Expression<Func<TEntity, TKey>> expression)
        {
            return new Ordering<TEntity>(query => query.OrderBy(expression));
        }
    
        public static Ordering<TEntity> ByDescending<TKey>(Expression<Func<TEntity, TKey>> expression)
        {
            return new Ordering<TEntity>(query => query.OrderByDescending(expression));
        }
    
        public Ordering<TEntity> ThenBy<TKey>(Expression<Func<TEntity, TKey>> expression)
        {
            return new Ordering<TEntity>(query => this.Transform(query).ThenBy(expression));
        }
    
        public Ordering<TEntity> ThenByDescending<TKey>(Expression<Func<TEntity, TKey>> expression)
        {
            return new Ordering<TEntity>(query => this.Transform(query).ThenByDescending(expression)); 
        }
    
        public IOrderedQueryable<TEntity> Apply(IQueryable<TEntity> query)
        {
            return Transform(query);
        }
    
    }
    

    ABC abc = new ABC();
    abc.Accept(Ordering<User>.By(u => u.Id));
    

    T 像这样:

    abc.Accept(Ordering.By(u => u.Id));
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   Jon Skeet    14 年前

    -泛型类型,具有泛型方法:

    public class XYZ
    {
        public static XYZ Action<T, TKey> (TKey key, T element)
        {
            return new XYZ<T>(element);
        }
    }
    

    编辑:回答问题编辑。

    不,你不能这样做:

    abc.Accept(Ordering.By(u => u.Id));
    

    问题是内在的表达:

    Ordering.By(u => u.Id)
    

    这是什么类型的 u 在这里?可以是任何有 Id 财产。注意,C编译器需要计算出这个表达式的类型 它看起来像 abc.Accept . 即使 只有 为一个 Ordering<User> ,它将失败。

    这里有三个选项:

    • Ordering<User>.By(u => u.Id)
      
    • 在非泛型类中使用泛型方法,显式指定两个类型参数:

      Ordering.By<User, string>(u => u.Id)
      
    • Ordering.By((User u) => u.Id)
      

    显然,所有这些情况都要求您在某处显式指定类型。

    小的 如果你已经有了一个 User

    public static Ordering<T> By<T,TKey>(Expression<Func<T, TKey>> func, T example)
    {
        return By<T, TKey>(func);
    }
    ...
    
    Ordering.By(u => u.Id, dummyUser);