无法将IQueryable <t>隐式转换为自定义类型,但其他类型可以使用

时间:2016-05-02 10:35:56

标签: c# implicit-conversion

我的应用程序的业务逻辑层执行自己的授权检查,所有数据查询操作都返回GuardedResult<TResult>值,这里的定义如下:

public class GuardedResult<TResult> {
    public TResult Result { get; }
    public Status Status { get; }
    public GuardedResult(TResult result, Status status) {
        this.Result = result;
        this.Status = status;
    }
    public static implicit operator GuardedResult<TResult>(TResult result) {
        return new GuardedResult<TResult>(result, Status.Success);
    }
}

像这样使用:

public partial class EmployeesBusinessLogic {

    public GuardedResult<Employee> GetEmployee(Int64 employeeId) {

        if( this.CurrentUser.CanReadAll ) {

            return this.Data.Employees.GetEmployeeById( employeeId );

        }
        else if( this.CurrentUser.CanReadSelf ) {

            if( this.CurrentUser.EmployeeId == employeeId ) {

                return this.Data.Employees.GetEmployeeById( employeeId );
            }
            else {

                return new GuardedResult<Employee>( null, Status.AccessDenied );
            }
        }
        else {
            return new GuardedResult<Employee>( null, Status.AccessDenied );
        }
    }
}

这构建并且工作正常。

但是,当我将TResult更改为封闭式通用IQueryable时,它会失败:

public GuardedResult<IQueryable<Employee>> GetEmployees() {

    if( this.CurrentUser.CanReadAll ) {

        return this.Data.Employees.GetAllEmployees();
    }
    else {

        return new GuardedResult<IQueryable<Employee>>( null, Status.AccessDenied );
    }
}

编译错误是:

  

错误CS0266
  无法隐式转换类型&#39; System.Linq.IQueryable<Initech.Employee>&#39;到&#39; Initech.GuardedResult<System.Linq.IQueryable<Initech.Employee>>&#39;。
   存在显式转换(您是否错过了演员?)

以下是EmployeesData类的相关定义:

public IQueryable<Employee> GetAllEmployees() {
    return this.dbContext.Employees;
}

public Employee GetEmployeeById(Int64 employeeId) {
    return this.dbContext.Employees.SingleOrDefault( e => e.EmployeeId == employeeId );
}

1 个答案:

答案 0 :(得分:1)

我知道我没有在这里回答你想要的东西,但是as it turns out,隐式铸造操作员在你的情况下不会工作(虽然令人困惑,原因在于规格,但是不要让我试着理解它,并看the answer为什么)

然后,对于您的具体情况,这是一个问题:

return new GuardedResult<IQueryable<Employee>>(
          this.Data.Employees.GetAllEmployees(), Status.Success);

再一次,更可能不是你想听到的