通过与c#中的列表进行比较来忽略类的属性

本文关键字:比较 属性 列表 | 更新日期: 2023-09-27 17:59:04

我有一个列表,其中TestClass是一个具有一些预定义属性的类。因此,当我获取数据并将列表与数据绑定时,我需要通过将它与列表进行比较来忽略TestClass的一些属性。我怎样才能做到这一点?

下面是我的代码

    public class TestClass
{
 public int id{get;set;}
 public string fname{get;set;} 
public string lname{get;set;}
public string job {get;set;}
public string role{get;set;}
public string address{get;set;}
}

List<TestClass> ulist = null;
   ulist = ToList<TestClass>(usersdataset.tables[0]); //fill my list with the data code is given below

因此,在将数据放入列表后,我需要通过将其与应该返回的属性列表进行比较来删除一些属性。例如,如果我的filteredlist只显示id、fname和role,那么我需要从我的ulist中删除额外的属性。因此在过滤器之后ulist应该只包含id、fname和角色

ToList方法

public static List<T> ToList<T>(DataTable dataTable) where T : new()
        {
            var dataList = new List<T>();
            //Define what attributes to be read from the class
            const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
            //Read Attribute Names and Types
            var objFieldNames = typeof(T).GetProperties(flags).Cast<PropertyInfo>().
                Select(item => new
                {
                    Name = item.Name,
                    Type = Nullable.GetUnderlyingType(item.PropertyType) ?? item.PropertyType
                }).ToList();
            //Read Datatable column names and types
            var dtlFieldNames = dataTable.Columns.Cast<DataColumn>().
                Select(item => new {
                    Name = item.ColumnName,
                    Type = item.DataType
                }).ToList();
            foreach (DataRow dataRow in dataTable.AsEnumerable().ToList())
            {
                var classObj = new T();
                foreach (var dtField in dtlFieldNames)
                {
                    PropertyInfo propertyInfos = classObj.GetType().GetProperty(dtField.Name);
                    var field = objFieldNames.Find(x => x.Name == dtField.Name);
                    //var field = filteredColumns.Find(x => x.PropertyName == dtField.Name);
                    if (field != null)
                    {
                        if (dataRow[dtField.Name] != DBNull.Value)
                            propertyInfos.SetValue(classObj, dataRow[dtField.Name], null);
                    }   
                }                   
                dataList.Add(classObj);
            }
            return dataList;
        }

通过与c#中的列表进行比较来忽略类的属性

使用overvride函数Equals:此示例仅比较id属性

public class TestClass
    {
        public int id { get; set; }
        public string fname { get; set; }
        public string lname { get; set; }
        public string job { get; set; }
        public string role { get; set; }
        public string address { get; set; }
        public override bool Equals(object obj)
        {
            if (obj.GetType().Name != this.GetType().Name)
            {
                return false;
            }
            TestClass testclassObject = (TestClass)obj;
            if (testclassObject.id != this.id)
            {
                return false;
            }
            return true;
        }