我正在进行一些重构,我意识到我有一些重复的代码正在进行中。旧代码:
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语句。有没有办法做到这一点? (我希望有一些更干净的代码。当然,如果有更好的方法可以做到这一点,我也会这样做。另外,忽略我遗漏了很多事实在回复中,它们应该隐含在评论中,它们在我保证的工作代码中存在。) 谢谢互联网。
答案 0 :(得分:0)
您可以在MVC代码上创建一个SelectedType并将其作为对象发送,然后您可以执行以下通用方法:
public JsonResult GetResult(InheritType type){
typeof(yourClass)
.GetMethod("GetResultGeneric")
.MakeGenericMethod(type.SelectedType.GetType())
.Invoke(yourClass, new object[] {type});
}