我有一个可投票项目的界面:(如 StackExchange、Reddit 等......)
// Irrelevant properties left out (Creator, Upvotes, Downvotes, etc)
internal interface IVotable
{
double HotScore { get; set; }
double VoteTotal { get; set; }
DateTime CreatedDate { get; set; }
}
我有一个具体的基类,它扩展了这个接口并定义了一个构造函数来填充默认属性:
internal class SCO : IVotable
{
public double HotScore { get; set; }
public double VoteTotal { get; set; }
public DateTime CreatedDate { get; set; }
public SCO(SPListItem item, List<Vote> votes)
{
VoteTotal = UpVotes - DownVotes;
HotScore = Calculation.HotScore(Convert.ToInt32(UpVotes), Convert.ToInt32(DownVotes), Convert.ToDateTime(item["Created"]));
CreatedDate = Convert.ToDateTime(item["Created"]);
}
这是一个正在使用的类的示例,它扩展了这个基类及其构造函数:
class Post : SCO
{
public string Summary { get; set; }
public Uri Link { get; set; }
public Post(SPListItem item, List<Vote> votes)
: base(item, votes)
{
Summary = (string) item["Summary"];
Link = new UriBuilder((string) item["Link"]).Uri;
}
}
超过 90% 的时间,我会返回已排序的类集合以在页面上呈现。
我希望有某种通用方法,它接收数据库项目的集合、与项目匹配的投票列表、创建列表,然后根据传递的定义如何排序的 ENUM 对列表进行排序。
我尝试了一些方法,其中许多基于以前的帖子。我不确定我是否以正确的方式处理这个问题。虽然这些解决方案确实有效,但我看到很多 Boxing、Reflection 或某种(可能主要的)牺牲性能以提高可读性或易用性。
只要该类扩展基类,创建可以在任何后续子类中使用的对象的排序列表的最佳方法是什么?
以前有效的方法:
<T>
嵌入在基类中的通用列表,Activator.CreateInstance
使用反射扩展以返回列表:
public static List<T> SortedCollection<T>(SPListItemCollection items, ListSortType sortType, List<Vote> votes) where T : SCO
索取使用样品:
static public List<Post> Get100MostRecentPosts(ListSortType sortType)
{
var targetList = CoreLists.SystemAccount.Posts();
var query = new SPQuery
{
Query = "<OrderBy><FieldRef Name=\"Created\" Ascending=\"False\" /></OrderBy>",
RowLimit = 100
};
var listItems = targetList.GetItems(query);
var votes = GetVotesForPosts(listItems);
return Post.SortedCollection<Post>(listItems, sortType, votes);
}