2015-05-13 5 views
0

Я пишу настраиваемый фильтр авторизации WebApi.cast actionContext.ActionArguments для типичного типа - проблемы, связанные с родовым типом

Мне нужно прочитать 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

Чтобы решить эту проблему, вы можете найти более простой путь.

Вы пытаетесь отбросить объект только для чтения поля 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), который даст вам ccess к этому свойству.

+0

Это большое спасибо JotaBe. Ваш код работал для меня с некоторыми незначительными настройками: – user3253659

Смежные вопросы