如何从通用参数获取所有属性和值

时间:2019-07-03 18:49:25

标签: c# asp.net-core

我想将所有通用T属性值列表与本地变量searchText进行比较。

我已经尝试过: x.GetType().GetProperties().All(props => props.GetValue(x).ToString().ToLower().Contains(searchText.ToLower()))

我收到错误消息:NullReferenceException: Object reference not set to an instance of an object.

enter image description here

这是我的完整方法:

protected List<T> ProcessCollection<T>(List<T> lstElements, IFormCollection requestFormData, Func<T, IComparable> getProp)
{
    string searchText = string.Empty;
    Microsoft.Extensions.Primitives.StringValues tempOrder = new[] { "" };
    if (requestFormData.TryGetValue("search[value]", out tempOrder))
    {
        searchText = requestFormData["search[value]"].ToString();
    }
    var skip = Convert.ToInt32(requestFormData["start"].ToString());
    var pageSize = Convert.ToInt32(requestFormData["length"].ToString());
    if (requestFormData.TryGetValue("order[0][column]", out tempOrder))
    {
        var columnIndex = requestFormData["order[0][column]"].ToString();
        var sortDirection = requestFormData["order[0][dir]"].ToString();
        tempOrder = new[] { "" };
        if (requestFormData.TryGetValue($"columns[{columnIndex}][data]", out tempOrder))
        {
            var columName = requestFormData[$"columns[{columnIndex}][data]"].ToString();

            if (pageSize > 0)
            {
                var prop = GetProperty<T>(columName);
                if (sortDirection == "asc")
                {
                    return lstElements.Where(x=>x.GetType().GetProperties().All(props => props.GetValue(x).ToString().ToLower().Contains(searchText.ToLower()))
                        .Skip(skip).Take(pageSize).OrderBy(b => prop.GetValue(b)).ToList();
                }
                else
                    return lstElements
                        .Where(x => getProp(x).ToString().ToLower().Contains(searchText.ToLower()))
                        .Skip(skip).Take(pageSize).OrderByDescending(b => prop.GetValue(b)).ToList();
            }
            else
                return lstElements;
        }
    }
    return null;
}

这就是我调用我的方法的方式:

var listItem = ProcessCollection<Jtabel>(temp,requestFormData,x=>x.Name);

我传递给方法的温度已满 这是我传递给此方法的类类型

public class Jtabel : BaseModel
{
    public string Creator { get; set; }
    public string Name { get; set; }
    public int SO { get; set; }
    public int SOD { get; set; }
    public int SAP { get; set; }
    public int BA { get; set; }
    public int Invoice { get; set; }
    public int EPD { get; set; }
    public double DP { get; set; }
}

我将尽我所能解释更多细节,所以我想将我的所有属性从Jtabel类转移到ProcessCollection,其中,所有Jtable属性内部的方法将测试包含searchText的每个元素。

0 个答案:

没有答案