使用属性列表检查对象值(反射)

时间:2014-03-31 07:31:45

标签: c# linq csv reflection

我目前正致力于动态上传模块。我们的想法是只为每个新文件定义文件和数据协定。目前我正在使用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 个答案:

答案 0 :(得分: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()来电。