-1

タイプに依存する関数でリストを注文する基本メソッドで基本クラスを作成しようとしています。

私のコンパイラはこのエラーを表示します

エラー 13 'System.Linq.Expressions.Expression<System.Linq.Expressions.Expression<System.Func<T,string>>' の 'System.Linq.Expressions.Expression<System.Func<MLOLPlus.Business.Dealer,string>>' を変換できません。D:\Documenti\Lavori\timage\MLOLPlus\src\MLOLPlus.Business\DataAcess\DataTablesClasses\DataTableMultiSort.cs 197 20 MLOLPlus.Business

IdentityEntity は、すべてのカスタム クラス データ型の基本抽象クラス ベースです。

例:

  1. ユーザーは IdentityEntity を継承します
  2. 編集者も

基本クラス マルチソート:

public class DataTableMultiSort
{

    public DataTableParameterModel DataTable { get; set; }

    public IQueryable<T> MultiSort<T>(IQueryable<T> basequery) where T : IdentityEntity{
        return CreateSortedQuery<T>(basequery, DataTable);
    }

    private IOrderedQueryable<T> CreateSortedQuery<T>(IQueryable<T> baseQuery, DataTableParameterModel parameterModel) where T : IdentityEntity
    {
        var orderedQuery = (IOrderedQueryable<T>)baseQuery;

        for (int i = 0; i < parameterModel.iSortingCols; ++i)
        {
            var ascending = string.Equals("asc", parameterModel.sSortDir[i], StringComparison.OrdinalIgnoreCase);
            int sortCol = parameterModel.iSortCol[i];

            Expression<Func<T, string>> orderByExpression = GetOrderingFunc<T>(sortCol);
            if (orderByExpression != null)
            {
                ...do things
            }
            else
            {
                if (ascending)
                {
                    orderedQuery = (i == 0)
                        ? orderedQuery.OrderBy(c => c.Id)
                        : orderedQuery.ThenBy(c => c.Id);
                }
                else
                {
                    ...
                }
            }

        }
        return orderedQuery;
    }

    protected virtual Expression<Func<T, string>> GetOrderingFunc<T>(int ColumnIndex) where T : IdentityEntity
    {
        return null;
    }

}

カスタム ユーザー マルチソート

  public class UserMultiSort : DataTableMultiSort
    {
        protected override Expression<Func<T, string>> GetOrderingFunc<T>(int ColumnIndex)
        {
            Expression<Func<User, string>> InitialorderingFunction;
            switch (ColumnIndex)
            {
                case 1:
                    InitialorderingFunction = c => c.FirstName;
                    break;
                case 2:
                    InitialorderingFunction = c => c.LastName;
                    break;
                default:
                    InitialorderingFunction = null;
                    break;
            }

            return InitialorderingFunction;
        }

    }

カスタム エディター マルチソート

public class EditorMultiSort : DataTableMultiSort
{
    protected override Expression<Func<T, string>> GetOrderingFunc<T>(int ColumnIndex)
    {
        Expression<Func<Editor, string>> InitialorderingFunction;
        switch (ColumnIndex)
        {
            case 1:
                InitialorderingFunction = c => c.BusinessName;
                break;
            case 2:
                InitialorderingFunction = c => c.Address;
                break;
            default:
                InitialorderingFunction = null;
                break;
        }

        return InitialorderingFunction;
    }

}
4

1 に答える 1

3

コンパイラ エラーが発生する理由は、 classに制限をかけるのではなく、一般的な制約を個々のメソッドにプッシュしたためです。あなたのやり方では、本質的にジェネリックなメソッド GetOrderingFunc<T>を a を返すメソッドでオーバーライドする方法はありませんExpression<Func<User, string>>

DataTableMultiSortジェネリックを作成し、メソッドからジェネリックパラメーターを削除すると、投稿したものが機能します。

public class DataTableMultiSort<T> where T : IdentityEntity
{
...
    protected virtual Expression<Func<T, string>> GetOrderingFunc(int ColumnIndex)
    {
        return null;
    }
}

public class UserMultiSort : DataTableMultiSort<User>
{
    protected override Expression<Func<User, string>> GetOrderingFunc(int ColumnIndex)
    {
        Expression<Func<User, string>> InitialorderingFunction;
        ...
     }
}
于 2014-11-05T14:34:28.260 に答える