我的存储库中有这两种方法:
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的名字?或者我必须采取另一种方式吗?
答案 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)
如果Posts
或Editables
对象的使用取决于用户输入,则应该使用单独的控制器方法来处理每个请求。您仍然可以通过让代码调用相同的方法来重用代码:
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
对象示例