В настоящее время я работаю над модулем динамической загрузки. Идея состоит в том, чтобы определять только файл и контракт данных для каждого нового файла. В настоящее время я использую отражение с 2 foreach, это тяжелый код для этого. Как вы можете видеть в коде, у меня есть объект, содержащий файл csv и 2 других списка. Эти два списка содержат все свойства объекта, для которого я хотел бы выполнить проверку данных.
var myCustomObjects = CsvSettings(new CsvReader(readFile, config)).GetRecords<MyCustomObject>();
var decimalProprties = GetPropertyNames<MyCustomObject>(typeof(decimal)).ToList();
var dateProprties = GetPropertyNames<MyCustomObject>(typeof(DateTime)).ToList();
foreach (var myCustomObject in myCustomObjects)
{
foreach (var dateProperty in dateProprties)
{
var value = myCustomObject.GetType().GetProperty(dateProperty).GetValue(myCustomObject, null);
Console.WriteLine(value); //code to check and report the value
}
Console.WriteLine(myCustomObject.Een + "|" + myCustomObject.Twee + "|" + myCustomObject.Drie);
}
Как я могу сделать это с помощью выражения или даже другого способа сделать менее тяжелый код?
1 ответ
Код кажется прекрасным как есть. Возможно, вы могли бы немного упростить его, используя метод, который возвращает пары ключ / значение для всех общедоступных свойств определенного типа, например (обработка ошибок исключена для краткости):
public static IEnumerable<KeyValuePair<string, T>> PropertiesOfType<T>(object myObject)
{
var properties =
from property in myObject.GetType().GetProperties()
where property.PropertyType == typeof(T) && property.CanRead
select new KeyValuePair<string, T>(property.Name, (T)property.GetValue(myObject));
return properties;
}
Тогда вы можете избежать дополнительного вызова GetProperty()
во внутреннем цикле:
foreach (var myCustomObject in myCustomObjects)
{
foreach (var dateProperty in PropertiesOfType<DateTime>(myCustomObject))
{
Console.WriteLine(dateProperty.Value); // code to check and report the value.
}
}
Также обратите внимание, что, похоже, вам не нужны вызовы .ToList()
.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.