单一方法创建排序列表<t>其中T:基类</t>

时间:2012-08-27 16:45:58

标签: c# generics inheritance instantiation abstraction

我有一个可投票项目的界面:(像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);
    }

0 个答案:

没有答案