2012-01-25 33 views
0

我正在使用C#編寫基本屬性/值映射類。如何使用表達式來定位特定成員

我希望能夠針對對象上的特定成員,然後通過lambda表達式指定與該成員有關的各種事情。

的想法是使用靜態方法像這樣來構建一個新的映射:

var myMapping = Mapping<TObject>.New(o => o.MyProperty).Read(GetString); 

在這個例子中,TObject的是對象的我要地圖的財產類型,新的(...)定位TObject的'MyProperty'成員,並且Read(...)定義一個表達式,該表達式返回與'MyProperty'相同類型的值。

所以我們現在有一個「映射」對象,它是知道的:

  1. 什麼成員與它相關聯。
  2. 如何獲取該成員的值。

然後,我們可以讓邏輯圍繞如何將該成員設置爲該值直到'Mapper'的繼承者。例如某種類型的映射可能需要「驗證」所讀取的值,如果它們有效,則只設置MyProperty。

你會再使用像這樣的映射:

myMapping.Read(myTObject); 

其中 'myTObject' 是類型的實例 'TObject的'。

我看到這種類型的東西通常在嘲笑庫如RhinoMock中的實現,您可以在其中定位特定成員併爲其設置選項。

有人能爲我提供一個如何實現這個目標的例子,或者至少告訴我我的頭是否在雲端?

+0

這不完全清楚你想在編譯時發生什麼,以及執行時什麼。現在,'var myMapping =(Func )(o => o.MyProperty);'然後'var s = myMapping(someTOject);'似乎做你想做的事情? – AakashM

+0

這是你需要的東西http://stackoverflow.com/questions/8990231/how-can-i-create-a-dynamic-select-on-an-ienumerablet-at-runtime/8990465#8990465 – AlanT

回答

0

你說的是Key,Value對嗎? Linq已經實現了Dictionary<T1, T2>類型。第一種是關鍵,第二種是價值。

你可以這樣做:

Dictionary<TObject, string> myMapping = new Dictionary(TObject, string); 

myMapping.Add(new TObject(), "some string"); 

要讀這將是:

string someString = myMapping[tObjectInstance].Value; 

你可以閱讀更多關於字典類,以及如何在這裏實現它:http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

相關問題