2017-03-28 18 views
1

如果我有幾個派生類,有沒有一種方法可以創建一個使用反射來處理它們的控制器?使用帶反射的[FromBody]發佈

[Route("api/{type:regex(forma|formb|formc)}")] 
public class FormController : BaseController 
{ 
    ... 

    [HttpPost] 
    public IActionResult CreateOrUpdateForm([FromBody] FormA forma, string type) 
    { 
     var formType = GetTypeFromName(type); 
     var submitMethod = _formService 
      .GetType() 
      .GetMethod("SaveForm") 
      .MakeGenericMethod(new Type[] {formType}); 
     var savedForm = submitMethod.Invoke(_formService, new object[]{forma}); 
     return createOkResponse(new 
     { 
      form = savedForm 
     }); 
    } 
} 

當我發佈FormA對象,但顯然不會,如果我發佈FormBFormC這工作。我試圖將其設置爲[FromBody] BaseForm form,但那也不起作用。是這樣的可能/好主意?後端邏輯是所有一切形式相同這就是爲什麼我試圖做到這一點

+1

這是可能的。我做過一次。在我看來,這是一個可怕的想法:-) –

+0

哈哈謝謝,你爲什麼認爲這是一個可怕的想法? – John

+1

我不認爲增加閱讀和調試代碼的複雜性是值得的。如果你封裝了共享邏輯,並且有許多類似的操作方法可以調用它,我懷疑你會發現它是一個維護的負擔,並且整個界面將更容易理解。 –

回答

0

你爲什麼不試試這個在你的控制器動作參數:

([FromBody] dynamic formObj, string type) 

動態關鍵字,讓這個編譯器確定運行時的對象屬性

+0

謝謝,我會看看,並嘗試它 – John

+0

這是導致一些反序列化錯誤。感謝 – John

+0

想發佈反序列化錯誤............? – victor