将actionContext.ActionArguments转换为泛型类型 - 转换为泛型类型的问题

时间:2015-05-13 10:36:06

标签: c# asp.net-web-api asp.net-web-api2

我正在编写自定义WebApi授权过滤器。

我需要从securitySqlConnectionString变量中读取actionContext。要做到这一点,我需要执行一个演员表(例如,我尝试使用TransactionRequestBundle<SearchDefault>),但问题是在TransactionRequestBundle<T>中,T会有所不同,因此下面的演员表会仅适用于TransactionRequestBundle<SearchDefault>类型。事实证明,我实际上并不关心T中存储的信息,所以我很乐意忽略存储在其中的信息。因此我认为我可以通过转换到object(如此处所示),但这会给我一个运行时转换错误。

var securitySqlConnectionString =
  ((TransactionRequestBundle<object>)
  actionContext.ActionArguments["transactionRequestBundle"])
  .Transaction.SecuritySqlConnectionString;

所以任何人都可以向我提供任何指导,说明我需要做些什么来使上面的行正常工作,特别是我用object代替什么?

public class XsycoApiAuthorizationFilter
   : ActionFilterAttribute, IActionFilter
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
      var securitySqlConnectionString =
        ((TransactionRequestBundle<object>)
          actionContext.ActionArguments["transactionRequestBundle"])
          .Transaction.SecuritySqlConnectionString;

      if (CacheMachine.GetEnvironments().Count == 0)
      {
        CacheLoader.Load(securitySqlConnectionString);
      }         
      base.OnActionExecuting(actionContext);
    }
}

public class TransactionRequestBundle<T>
{
    public Transaction Transaction;
    public T Model { get; set; }
    public XsycoDebugBundle XsycoDebugBundle { get; set; }

    public TransactionRequestBundle()
    {
        this.Transaction = new Transaction();
        this.XsycoDebugBundle = new XsycoDebugBundle();
        this.Model = Activator.CreateInstance<T>();
    }

}

public class Transaction 
{
      public string SecuritySqlConnectionString { get; set; }
}

1 个答案:

答案 0 :(得分:0)

您可以采取更简单的方法来解决此问题。

您尝试仅在阅读Transaction字段时强制转换对象。你可以做的是创建一个这样的界面:

public interface ITransaction
{
    public Transaction Transaction { get; set; }
}

然后在你的课程中实现它

public class TransactionRequestBundle<object> : ITransaction

要实现它,只需将Transaction字段转换为Transaction属性,就像在界面中一样:

    public Transaction Transaction { get; set; }

最后,不要强制转换为((TransactionRequestBundle<object>),只需将其转换为(ITransaction)即可让您访问该属性。