我正在编写自定义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; }
}
答案 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)
即可让您访问该属性。