将 actionContext.ActionArguments 转换为通用类型 - 转换为通用类型时出现问题

cast actionContext.ActionArguments to generic type - problems casting to generic type

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

我需要从 actionContext 变量中读回 securitySqlConnectionString。为此,我需要执行转换(例如,我尝试使用 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; }
}

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

您正在尝试仅为了读取 Transaction 字段而转换对象。你可以做的是创建一个这样的界面:

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

然后在你的 class

中实现它
public class TransactionRequestBundle<object> : ITransaction

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

    public Transaction Transaction { get; set; }

最后,不要转换为 ((TransactionRequestBundle<object>),只需将其转换为 (ITransaction),这样您就可以访问 属性.