Ich habe eine Liste, wo TestClass eine Klasse mit einigen vordefinierten Eigenschaften ist. Wenn ich also Daten erhalte und meine Liste mit Daten verbinde, muss ich einige Eigenschaften von TestClass ignorieren, indem ich sie mit einer Liste vergleiche. Wie kann ich das erreichen?Ignoriere Eigenschaften der Klasse durch Vergleich mit einer Liste in C#
Unten ist mein Code
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
so, nachdem Sie die Daten in die Liste immer ich brauche, um einige Eigenschaften zu entfernen, indem Sie es mit der Liste von Eigenschaften zu vergleichen, die returned.for Beispiel sein soll, wenn mein FilteredList nur id zeigen sollte , fname, Rolle dann muss ich die zusätzlichen Eigenschaften von meinem ulist entfernen. so nach dem Filter ulist nur id, fname und Rolle
ToList Methode
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;
}
, was ist falsch mit deinem Code? Ich kann sehen, wo es prägnanter und effizienter sein kann, aber verursacht es einen Fehler? Was genau suchen Sie Hilfe auf – CharlesNRice
Können Sie eine 'List' an 'ToList' übergeben, die eine Liste von Eigenschaftennamen enthält, die Sie ignorieren möchten? Dann hätten Sie sie in Ihrer Schleife 'foreach (var dtField in dtlFieldNames.Where (f =>! IgnoreList.Contains (f))' niemals ausgefüllt. Andernfalls müssen Sie die Reflektion erneut verwenden, um jedes Element zu durchlaufen in Ihrer Liste und löschen Sie jede der Eigenschaften einzeln, indem Sie Reflection 'GetProperties' wieder verwenden –
pinkfloydx33
Nur eine Anmerkung: da' T' für die gesamte Funktion gleich bleibt, brauchen Sie nicht die 'PropertyInfo propertyinfos = classObj .. . 'Zeile in der Schleife. Verschiebe sie nach oben.' var requiss = typeof (T) .GetProperties (Flags). ToDictionary (x => x.Name) 'und dann die Zeile in der Schleife durch etwas wie' var ersetzen propertyInfos = reps [dtField.Name]; 'Auf diese Weise können Sie das PropertyInfo-Objekt weiterverwenden, ohne es mit Reflection nachschlagen zu müssen (trotz unterschiedlicher Objekte ist das PropertyInfo-Objekt identisch - daher der erste Parameter zu' SetValue () 'wo Sie das Objekt angeben, an dem es aufgerufen werden soll) – pinkfloydx33