0

我有以下代码:

public IEnumerable<T> PageData<T>(Expression<Func<T, bool>> predicate, int pageNumber, int pageSize, bool trace)
    {
        var skip = 0;
        if (pageNumber > 0)
        {
            skip = pageNumber - 1;
        }

        List<T> data;
        using (IDbConnection db = _dbFactory.OpenDbConnection())
        {
            var totalResults = db.Select<T>(predicate);
            data = totalResults.Skip(pageSize * skip).Take(pageSize).ToList();

            if (data.Any())
            {
                var firstRecord = data.FirstOrDefault();
                if (firstRecord != null)
                {
                    data.FirstOrDefault().GetType().GetProperty("TotalCount").SetValue(this, totalResults.Count(), null);
                    data.FirstOrDefault().GetType().GetProperty("TotalPages").SetValue(this, totalResults.Count() / pageSize, null);
                    data.FirstOrDefault().GetType().GetProperty("PageNow").SetValue(this, pageNumber, null);
                }
            }

            if (trace) { TraceOut(db.GetLastSql()); }
        }
        return data;
    }

但是,我的属性是作为基类继承到 T 中的。当 getProperty 在 base.property 内时,我将如何设置该值。

当我尝试时,我收到以下错误:

对象与目标类型不匹配

这是在线的:

data.FirstOrDefault().GetType().GetProperty("TotalCount").SetValue(this, totalResults.Count(), null);

这些属性确实存在,很好,就在基地内部。

谢谢

4

4 回答 4

1

事实上,你不需要反思。您可以以类型安全的方式执行此操作,例如

public IEnumerable<T> PageData<T>(Expression<Func<T, bool>> predicate, 
     int pageNumber, int pageSize, bool trace) where T: BaseClass

BaseClass你的基类在哪里包含TotalCount等等。

于 2013-10-16T16:39:53.230 回答
1

但是,我的属性是作为基类继承到 T 中的。

您需要做的就是T包含在基类中。然后,您将能够直接使用设置器。

public IEnumerable<T> PageData<T>(Expression<Func<T, bool>> predicate, 
                                  int pageNumber, 
                                  int pageSize, 
                                  bool trace) 
                                  where T: BaseClassName
{
    var skip = 0;
    if (pageNumber > 0)
    {
        skip = pageNumber - 1;
    }

    List<T> data;
    using (IDbConnection db = _dbFactory.OpenDbConnection())
    {
        var totalResults = db.Select<T>(predicate);
        data = totalResults.Skip(pageSize * skip).Take(pageSize).ToList();

        if (data.Any())
        {
            var firstRecord = data.FirstOrDefault();
            if (firstRecord != null)
            {
                int count = totalResults.Count();
                firstRecord.TotalCount = count
                firstRecord.TotalPages = count / pageSize;
                firstRecord.PageNow = pageNumber;
            }
        }

        if (trace) { TraceOut(db.GetLastSql()); }
    }
    return data;
}
于 2013-10-16T16:40:28.757 回答
1

如果我正确理解你的问题,你根本不需要反思。

您似乎确信您的 T 具有所需的属性,因为它派生自具有这些属性的基类。因此,只需为您的方法添加一个通用约束。

public IEnumerable<T> PageData<T>(
    Expression<Func<T, bool>> predicate, int pageNumber, int pageSize, bool trace)
    where T: Baseclass
{
    var skip = 0;
    if (pageNumber > 0)
    {
        skip = pageNumber - 1;
    }

    List<T> data;
    using (IDbConnection db = _dbFactory.OpenDbConnection())
    {
        var totalResults = db.Select<T>(predicate);
        data = totalResults.Skip(pageSize * skip).Take(pageSize).ToList();

        if (data.Any())
        {
            var firstRecord = data.FirstOrDefault();
            if (firstRecord != null)
            {
                firstRecord.TotalCount = totalResults.Count();
                firstRecord.TotalPages = 
                    (totalResults.Count() + pageSize - 1) / pageSize;
                firstRecord.PageNow = pageNumber;
            }
        }

        if (trace) { TraceOut(db.GetLastSql()); }
    }
    return data;
}

顺便说一句,您对 TotalPages 的计算是错误的。请参阅上文以获得更好的计算。

于 2013-10-16T16:41:36.297 回答
0

尝试确保用于获取属性的类型与作为第一个参数传递的对象的类型相同SetValue

var firstRecord = data.FirstOrDefault();
if (firstRecord != null)
{
    firstRecord.GetType().GetProperty("TotalCount").SetValue(firstRecord, totalResults.Count(), null);
    ...
}

或这个:

var firstRecord = data.FirstOrDefault();
if (firstRecord != null)
{
    typeof(T).GetProperty("TotalCount").SetValue(firstRecord, totalResults.Count(), null);
    ...
}
于 2013-10-16T16:33:26.617 回答