2013-04-30 120 views
1

我正在編寫一個包裝執行sql語句並返回結果的數據庫的包裝。C#動態:動態分配屬性

ExecuteQuery命令最好返回IEnumerable<T>,具體取決於查詢結果映射到的對象類型。問題是,我不知道這將是什麼類型,因此我寧願返回一個IEnumerable<dynamic>類型。

這是迄今爲止都很好,除了我希望動態對象屬性與被查詢的列相同,但我無法找到分配這個,我目前有一個數組中的所有列名col []例如

dynamic obj = new {} as dynamic; 
for(int i = 0; i < col.Length; i++){ 
    //say col[i] == 'id', I want obj.id = someValue 
    obj.? = someValue; ??? 
} 

我希望這很清楚。我希望這不是不可能的!

p.s.我正在爲WP7寫這個,所以我的選項非常有限,請記住這一點很合適。

感謝您的幫助。

+0

感謝編輯@DanielHilgarth,我的打字只是所有的地方 – 2013-04-30 14:22:44

+0

類似,非WP:[動態設定一個C#匿名類型的屬性名稱] (http://stackoverflow.com/questions/1642733/dynamically-set-the-property-name-of-ac-sharp-anonymous-type) – nawfal 2014-07-19 19:15:34

回答

1

dynamic不適用於您的情況。當您知道編譯時間的屬性名稱時使用dynamic,但不是該屬性將在其上定義的實際類型。

如果您知道屬性的名字只在運行時,你將不得不使用普通的反射,這樣的事情:

obj.GetType() 
    .GetProperty(col[i]) 
    .SetValue(obj, someValue); 

請注意,dynamic obj = new {} as dynamic;使得完全沒有意義的。這將創建一個沒有任何屬性的匿名類型。將它賦值給dynamic變量不會改變它沒有的事實,也決不會改變任何屬性。

如果您嘗試動態地將屬性添加到對象,您可能需要使用ExpandoObject

用法是這樣的:

IDictionary<string, object> obj = new ExpandoObject(); 
for(int i = 0; i < col.Length; i++) 
{ 
    obj.Add(col[i], someValue); 
} 

return (dynamic)obj; 
+0

好的,酷會嘗試它,謝謝。 – 2013-04-30 13:54:43

+0

錯誤,你是說假設一個不同的場景,如果我做了obj.SomeProperty =「有些值」;該obj仍然沒有任何屬性? 我這樣做的原因是這樣引用不會爲空! – 2013-04-30 13:55:56

+0

@ObiOnuorah:的確如此。你只需要一個'RuntimeBinderException':*''<> f__AnonymousType0''不包含'SomeProperty'*的定義。 – 2013-04-30 13:58:44