2011-10-11 24 views
1

我試圖確定使用什麼......當使用表達式

我有一個要求通過一項IEnumerable<TSource>一個寫入實體成員的值文件中的函數。這裏是什麼IEnumerable的樣子:

var persons = new[] { 
    new Person { 
     RecordID = 0, 
     PersonFName = "Joe", 
     PersonMName = "", 
     PersonLName = "Smith", 
     PersonZip="75227" 
    }, 
    new Person { 
     RecordID = 1, 
     PersonFName = "Mary", 
     PersonMName = "Hada", 
     PersonLName = "Lamb", 
     PersonZip="75217" 
    }}; 

是什麼了IEnumerable傳遞給讀取每一個實體,所以我可以讀取每個字段值的函數的最佳方式?

我在想,我會使用類似:

void WriteData<TSource>(Expression<IEnumerable<Person>> expression) 
{ 
    // do stuff 
} 

我無法找到解釋如何確定什麼時候應該使用一個表達對剛好路過IEnumerable的資源。然後,如何創建反映persons的表達式?

理想的情況下,它看起來像我所說的寫數據,像這樣:

WriteData(persons); 

難道我即使是在朝着正確的方向?

+0

如果你真的有興趣學習如何利用表達式和'IQueryable'接口,我強烈推薦閱讀Matt Warren的[LINQ:構建一個IQueryable提供者系列](http://blogs.msdn.com/b/mattwar /archive/2008/11/18/linq-links.aspx)。警告:Metaprogramming可能會很複雜,需要時間和耐心 – smartcaveman

+0

@smartcaveman:謝謝,我會檢查出來。 – IAbstract

回答

5

我沒有理由在這裏使用表達式樹。如果你只是想通過反射來獲取所有的屬性,我建議你這樣做 - 表達式樹並不會真的幫你做到這一點。

注意,選擇很少和IEnumerable<T>之間Expression - 它通常是是表達式樹和代表之間或IEnumerable<T>IQueryable<T>

+0

謝謝......只是想弄清楚我需要使用什麼。我不想使用反射......但我並沒有真正有更好的解決方案。 – IAbstract

+0

@IAbstract:然後你不知道你想做什麼。你爲什麼認爲表達樹正在添加任何東西? '表達式>'甚至不是一個現實的類型,因爲'Expression '中的'T'應該總是*真的是代表類型。 –

+0

好的,這很有道理 - 'Expression >'看起來很奇怪,看起來不太合適。我正冒險嘗試一些與衆不同的專業知識。 – IAbstract

0

我不知道你會用表達式做什麼,但這大概是我會用反射做的。

public void WriteData<T>(IEnumerable<T> objects) where T : class 
{ 
    foreach (var obj in objects) 
    { 
    WriteObjectData(obj); 
    } 
} 

private void WriteObjectData<T>(T obj) where T : class 
{ 
    foreach (var propertyInfo in typeof(T).GetProperties()) 
    { 
     // Use propertyInfo.GetValue to get the value from obj. 
    } 
} 

你可以指定一個接口,而不是where T:class限制的方法,如果你想只是你的數據對象。

+0

對,我認爲@JonSkeet在說我應該這樣做。 – IAbstract