2013-11-01 62 views
3

我正在使用ServiceStack請求過濾器,我想要檢查requestDTO參數的其中一個屬性。該參數在運行時強類型化,但在編譯時是一個通用對象。按類型訪問ServiceStack requestDto對象

該過濾器將用於多個服務調用,因此requestDTO類型將根據調用的內容而改變。因此我無法對它進行特定的演員表演。但是,不管類型如何,requestDTO對象將始終有一個名爲「AppID」的字符串屬性。這是我希望訪問的這個屬性。

這裏是我的代碼(目前不編譯):

public override void Execute(ServiceStack.ServiceHost.IHttpRequest req, ServiceStack.ServiceHost.IHttpResponse res, object requestDto) 
     { 
      //Check only for non-local requests 
      if (!req.IsLocal) 
      {     
       var app = this._appIDs.Apps.Where(x => x.ID == requestDto.AppID).FirstOrDefault(); 

       var errResponse = DtoUtils.CreateErrorResponse("401", "Unauthorised", null); 
       var contentType = req.ResponseContentType; 
       res.WriteToResponse(req, errResponse); 
       res.EndRequest(); //stops further execution of this request 
       return; 
      } 
     } 

此行不會編譯:

var app = this._appIDs.Apps.Where(x => x.ID == requestDto.AppID).FirstOrDefault(); 

我需要與反思這裏要處理訪問我的對象或有沒有內置到ServiceStack本身?

回答

5

應用通用的功能,以共同請求DTO的時候首選的方法是讓他們實現相同的接口,如:

public interface IHasAppId 
{ 
    public string AppId { get; set; } 
} 

public class RequestDto1 : IHasAppId { ... } 
public class RequestDto2 : IHasAppId { ... } 

然後在你的過濾器,你可以這樣做:

var hasAppId = requestDto as IHasAppId; 
if (hasAppId != null) 
{ 
    //do something with hasAppId.AppId 
    ... 
} 

你也可以避免使用接口並使用反射來代替,但這樣會更慢,更不可讀,所以我推薦使用接口。

+0

Gargh,當然。他們已經實施了適當的界面,我很愚蠢。再次感謝。 – Simon