通过动态选择方法使控制器更高效

时间:2014-09-10 18:41:06

标签: c# asp.net

我的存储库中有这两种方法:

    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;
        }

因此,有可能使这种方法更具动态性并插入正确的方法

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

从我的视角传递nethod的名字?或者我必须采取另一种方式吗?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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对象示例