从View MVC4将类型传递给通用操作

时间:2014-05-29 20:46:52

标签: c# asp.net-mvc-4

我正在进行一些重构,我意识到我有一些重复的代码正在进行中。旧代码:

public JsonResult GetResult(InheritType type)
{
    if(type == InheritType.TypeOne){
        var iqueryable = Session.Query<TypeOneInherit>()
        //34 lines of repeated code
    }else if(type == InheritType.TypeTwo){
        var iqueryable = Session.Query<TypeTwoInherit>()
        //34 lines of repeated code
    }else if(type == InheritType.TypeThree){
        var iqueryable = Session.Query<TypeThreeInherit>()
        //34 lines of repeated code
    }
}

我用以下内容替换了它:

public JsonResult GetResult(InheritType type){
    switch(type){
        case type.TypeOne:
            return GetResultGeneric<TypeOneInherit>
        case type.TypeTwo:
            return GetResultGeneric<TypeTwoInherit>
        case type.TypeThree:
            return GetResultGeneric<TypeThreeInherit>
    }
}

public JsonResult GetResultGeneric<T>(InheritType type) where T : Base
{
        var iqueryable = Session.Query<T>()
        //34 lines of non repeated code

}

我想要做的就是完全摆脱GetResult方法。现在我的行​​动看起来像这样:

@Url.Action("GetResult", "ResultController", new { type = InheritType.TypeOne })

正在javascript中设置操作以用作JQGrid的url。 我不想传入枚举值,而是希望能够传递类型,以便绕过if块或switch语句。有没有办法做到这一点? (我希望有一些更干净的代码。当然,如果有更好的方法可以做到这一点,我也会这样做。另外,忽略我遗漏了很多事实在回复中,它们应该隐含在评论中,它们在我保证的工作代码中存在。) 谢谢互联网。

1 个答案:

答案 0 :(得分:0)

您可以在MVC代码上创建一个SelectedType并将其作为对象发送,然后您可以执行以下通用方法:

public JsonResult GetResult(InheritType type){
    typeof(yourClass)
          .GetMethod("GetResultGeneric")
          .MakeGenericMethod(type.SelectedType.GetType())
          .Invoke(yourClass, new object[] {type});


}