所以,我有2个基本接口。例如:
public interface IPageParameter
{
int Pagenumber { get; set; }
}
public interface IPageModel
{
int CurrentPage { get; set; }
IPageParameter GetLinkParameter();
}
现在我想扩展它们,而不更改它们,所以我写了两个新的接口:
public interface IPageParameterExt : IPageParameter
{
int PerPage { get; set; }
}
public interface IPageModelExt : IPageModel
{
int CurrentPerPage { get; set; }
new IPageParameterExt GetLinkParameter();
}
现在,如果我在一个类中实现它,我需要编写两个函数
public class DefaultPageParameterExt : IPageParameterExt
{
public int Pagenumber { get; set; }
public int PerPage { get; set; }
}
public class PageModel : IPageModelExt
{
public int CurrentPage { get; set; }
public int CurrentPerPage { get; set; }
IPageParameterExt IPageModelExt.GetLinkParameter()
{
return new DefaultPageParameterExt()
{
Pagenumber = CurrentPage,
PerPage = CurrentPerPage
};
}
IPageParameter IPageModel.GetLinkParameter()
{
return ((IPageModelExt)this).GetLinkParameter();
}
}
但这对我来说似乎不太好。我的意思是,如果它进一步扩展,这是否意味着每次必须编写另一个GetLinkParameter?或者有没有办法告诉接口这个函数可以用于其父函数?或者告诉班级你可以使用这个函数来实现这两个函数吗?
修改 好的,因为这里的问题是我想用给定的例子做的(这是我需要的最简单的时间,但我需要用类似的术语来完成其他一些任务):
我目前正在使用ASP Core 2.0.5 Razorpages并实现了多个IHtmlHelper扩展,在那里Pagemodels实现了IPageModel
,以便能够创建一些简单的元素分页。 IPageParameter
包含创建具有更改参数的超链接所需的内容(例如,第一页为Pagenumber = 1
或下一页为Pagenumber += 1
。
现在我的工作是创建一个IHtmlHelper扩展,它允许它选择每页显示多少个元素,而不是使用固定的值。
EDIT2:
这里有一些扩展的简化代码,因为它已被请求。
public static IHtmlContent GetPageButtons<TModel>(this IHtmlHelper<TModel> helper, TModel Model)
where TModel : IPageModel
{
var urlHelper = new UrlHelper(helper.ViewContext);
var html = new HtmlContentBuilder();
var para = Model.GetLinkParameter();
string prevclass = Model.CurrentPage <= 1 ? "btn btn-default disabled" : "btn btn-default";
html.AppendHtml(@"<table style=""width:1%"">")
.AppendHtml("<tr>")
.AppendHtml("<td>");
/*other buttons*/
para.Pagenumber = Model.CurrentPage -1;
html
.AppendFormat(@"<a href=""{1}"" class=""{0}"">{2}</a>", prevclass, urlHelper.Action("", para), "<")
.AppendHtml("</td>")
/*other buttons*/
.AppendHtml("</tr>")
.AppendHtml("</table>");
return html;
}
答案 0 :(得分:1)
对于仿制药有很多好处。不要为每种可能的类型编写新的扩展,只需对所有可能类型使用单一方法。那你甚至不需要任何扩展接口:
public interface IPageModel<T>
{
int CurrentPage { get; set; }
T GetLinkParameter<T>();
}
public class PageModel : IPageModel<IMyInterface>
{
public int CurrentPage { get; set; }
IMyInterface GetLinkParameter()
{
return new DefaultPageParameterExt()
{
Pagenumber = CurrentPage,
PerPage = CurrentPerPage
};
}
}