我有一个可投票项目的界面:(像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%的时间,我正在返回类的已排序集合以在页面上呈现。
我希望有一种类型的泛型方法,它接受DataBase项的集合,与项匹配的投票列表,创建List,然后根据传递的ENUM对列表进行排序,定义如何排序。
我尝试过几种方法,其中很多都基于以前的帖子。我不确定我是否以正确的方式接近这个。虽然解决方案确实有效,但我看到很多Boxing,或者反射,或者某些(可能是主要的)性能上的牺牲,以提高可读性或易用性。
创建可在任何后续子类中使用的对象的排序列表的最佳方法是什么,只要该类扩展基类?
以前正在运作的方法:
Create a List of <T> from a base class
嵌入在基类中的<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);
}