2014-09-10 70 views
1

更高效的我有我的资料库这两种方法:制作控制器,通过选择方法动态

public IEnumerable<Post> Posts 
    { 
     get { return context.Posts; } 
    } 


    public IEnumerable<Editables> Editables 
    { 
     get { return context.Editables; 
    } 

这里是我的方法:

public ActionResult SaveEdit(int activeid,string text, string prop, string REPOMETHOD) 
     { 
      var elementToEdit = _repository.<dynamic insert Post or Editable>.ElementAt(activeid); 
      var type = elementToEdit.GetType(); 
      PropertyInfo p = type.GetProperty(prop); 
      p.SetValue(elementToEdit, text, null); 

      _repository.UpdateBigLinkEdit(elementToEdit, activeid); 

      return null; 
     } 

因此,二有可能使这个methid更动态并插入正确的方法

_repository.Editables.ElementAt(activeid) OR _repository.Post.ElementAt(activeid); 

通过从我的视图中传递nethod的名称?或者我必须以另一种方式去做?

+2

有代码共享,减少重复一个好处,但它是在可读性为代价和可维护性。即使你可以得到这个工作,它也会混淆任何必须维护这个代码的人。我的建议是将其分开并将其分开。 – 2014-09-10 18:44:42

+1

@DaveZych如果他有10个或更多的类需要“使用”相同的方法。你认为为每个班级配备一个完整的save-method/if-statements/switch会更好吗? – user3228992 2014-09-10 18:56:29

回答

4

是的,你可以用通用的方法:

public T GetElement<T>(int id) 
{ 
    if (typeof(T) == typeof(Post)) return Posts.ElementAt(id); 
    if (typeof(T) == typeof(Editable)) return Editables.ElementAt(id); 
    throw new InvalidTypeException(); 
} 

,然后用它

var element = _repository.GetElement<Post>(activeId); 
+0

谢谢!我要仔细看看这个! – user2915962 2014-09-10 19:05:41

+2

不是所有的代码路径都会返回一个值:) – Kjata30 2014-09-10 19:07:07

+1

@ Kjata30,通过添加一个可以改变他们的喜好的异常来修复。 – user145400 2014-09-10 19:08:33

1

如果使用PostsEditables对象以用户输入为条件,则应该有单独的控制器方法来处理每个请求。

public ActionResult Save(int activeId, string text) 
{ 
    var elementToEdit = _repository.Posts.ElementAt(activeid); 
    return SaveEdit(activeId, text, elementToEdit); 
} 

public ActionResult Edit(int activeId, string text) 
{ 
    var elementToEdit = _repository.Editables.ElementAt(activeId); 
    return SaveEdit(activeId, text, elementToEdit); 
} 

private ActionResult SaveEdit(int activeId, string text, object elementToEdit) 
{ 
    // logic from your original method 
} 

如果条件为使用对象队伍用户输入,你应该能够使用if条件设置elementToEdit:您仍然可以通过让他们每个调用相同的方法重用代码对象在您的原始代码示例中。

+0

对于每个用户145400,通用方法中的“if”语句将是一种优雅的方法。 – Kjata30 2014-09-10 19:05:02

+0

谢谢,生病请看这个 – user2915962 2014-09-10 19:06:23