2015-05-13 147 views
0

我在寫一個自定義的WebApi授權過濾器。cast actionContext.Action泛型類型參數 - 轉換爲泛型類型的問題

我需要從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; } 
} 

回答

0

您可以採取更簡單的方法來解決此問題。

您正試圖僅爲讀取Transaction字段而投射該對象。你可以做的是創造一個這樣的接口:

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

然後實現它在你的類

public class TransactionRequestBundle<object> : ITransaction 

要implemente它只是Transaction字段轉換成Transaction屬性,就像在界面:

public Transaction Transaction { get; set; } 

最後,而不是鑄造((TransactionRequestBundle<object>)簡單地將其轉換爲(ITransaction),這將給你一個使用該財產。

+0

非常感謝JotaBe。你的代碼爲我做了一些小的調整: – user3253659