【问题标题】:Using method parameter as generic type argument使用方法参数作为泛型类型参数
【发布时间】:2012-05-17 10:47:19
【问题描述】:

我有一个包含搜索参数的类 (SearchParameters),然后我使用一个名为 Querybuilder 的通用类基于这些创建一个 linq 查询。这将返回结果并且一切正常。

结果显示在 GridView 中,我目前正在为 gridivew 实现自定义排序,我将要搜索的字段添加到 SearchParameters 对象(使用流畅的界面)

SearchParameters=SearchParameters.SortResultsBy(e.SortExpression,e.NewSortOrder.ToString());

我需要将列的数据类型用作我的 AddOrderByClause() 方法的通用参数:

    public void AddOrderByClause<D>(string field, Type sourceDateType)
    {
        var orderExpression = Expression.Lambda<Func<T, D>>(Expression.Property(resultExpression, field), resultExpression);

        rootExpression = Expression.Call(
              typeof(Queryable),
              "OrderBy",
              new Type[] { typeof(T), typeof(D) },
       rootExpression,
       orderExpression);

    }

我可以很容易地找到列的数据类型,但是如何将其传递给AddOrderByClause()(通用参数D)?

【问题讨论】:

    标签: c# linq generics expression


    【解决方案1】:
    public void AddOrderByClause<D,E>(string field, E sourceDataType)
    {
        .....
    }
    

    【讨论】:

      【解决方案2】:

      使用反射获取方法AddOrderByClause,然后使用MakeGenericMethod获取泛型。这是一般的想法(有点模糊,因为我不知道你所有的类型都叫什么名字)。

      Type MyTypeParameter;    // TODO set this to type parameter D
      Type type;               // TODO set this to the type that contains the method "AddOrderByClause"
      MethodInfo method = type.GetMethod("AddOrderByClause");
      MethodInfo genericMethod = method.MakeGenericMethod(typeof(MyTypeParameter));
      genericMethod.Invoke(MyClassInstance, FieldParam, SourceDataParam);
      

      【讨论】:

        【解决方案3】:

        但是我如何将它传递给 AddOrderByClause()(通用参数 D)?

        似乎您已经有了列的数据类型,并且您正在弄清楚如何将其传递给通用方法

        下面是例子

        首先修改 AddOrderByClause 以接受 T(稍后在您的函数中使用)

        public void AddOrderByClause<D,T>(String field)
        {
        ....
        }
        

        然后像这样调用 AddOrderByClause

         var data = SearchParameter;// Use actual data if SearchParameter is not correct
         AddOrderByClause<D,date.GetType()>(fieldData);// assuming fieldData is something different 
         var data = SearchParameter;// Use actual data if SearchParameter is not currect
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-11
          相关资源
          最近更新 更多