将 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)
,这样您就可以访问 属性.
我正在编写自定义 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)
,这样您就可以访问 属性.