2014-03-31 48 views
0

我目前正在使用動態上載模塊。這個想法是隻爲每個新文件定義文件和數據合同。目前我使用反射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); 
} 

我該如何用表達式或甚至另一種方式來實現這麼簡單的代碼呢?

+0

「重」代碼是什麼意思?這畢竟是反思...... – RePierre

+1

您最關心的是什麼?性能?可讀性?簡單? ...? –

+0

性能,如果我的csv有9k行,我檢查10個屬性,它會運行90k次的反射。我寧願看到加載了10次的反射並將其加載到內存中... – Freddy

回答

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()電話。

+0

我用這個解決方案遇到的問題是反射被稱爲這麼多時間。我認爲正因爲如此,代碼運行需要更多的精力和時間。 – Freddy

+1

@Freddy你有沒有計時確定它是一個問題? C#中的反射其實很快。 –