2010-04-27 96 views
3

因此,我一直在努力研究這一整個上午,並沒有運氣。我試圖找到一種方法來動態地創建一個方法/委託/ lambda,它返回某個基類的特定類的新實例(直到運行時才知道)。動態創建方法

我可以保證關於未知/動態類

  1. 它將總是從一個已知的類(行)
  2. 它將具有至少2層構造(一個接受一個長期的,和一個接受繼承以下一個IDataRecord)

我打算doign如下:

  1. 找到所有的C這對他們
  2. 特定屬性創建lasses委託/方法/λ/不管是創建類
  3. 的新實例存儲委託/無論在一個結構/類的一些屬性一起
  4. 插入結構化爲散列表
  5. 需要時,將信息從哈希表中拉出並調用委託/無論如何獲得該類的新實例並將其返回/添加到列表/等。

我只需要#2以上的幫助!我不知道從哪裏開始。我真的只需要一些參考資料來讓我開始,或者一些關鍵詞投入到谷歌。

這是一個小巧/易於使用的ORM在我們這裏的辦公室。我明白上述並不簡單,但一旦工作,應該使維護代碼變得非常簡單。

如果您需要更多信息,請讓我知道!並提前致謝! :)

回答

4

您可以使用LINQ表達式構建拉姆達(long p) => new XXX(p) as Row在運行時:

Type type = // ... 
ConstructorInfo ctor = type.GetConstructor(new Type[] { typeof(long) }); 

var p = Expression.Parameter(typeof(long), "p"); 
var expr = Expression.Lambda<Func<long, Row>>(
       Expression.TypeAs(
        Expression.New(ctor, p), 
        typeof(Row)), 
       p); 

Func<long, Row> rowCreator = expr.Compile(); 

Row row = rowCreator(10); 
+1

從來沒有真正看到表達的良好用法,但你睜開了我的眼睛:) – Stormenet 2010-04-27 18:06:32

+0

我喜歡的風格,但它編譯爲真正的IL和表現良好的新的長(); – Andrey 2010-04-27 18:12:08

+0

@Andrey:'expr.Compile()'將表達式編譯成真正的IL。性能與編譯時編譯lambda表達式時相同,所以它的性能如下:-) – dtb 2010-04-27 18:14:35

3

Activator.CreateInstance

樣本:

string typeName = ...; 
Activator.CreateInstance(Type.GetType(typeName), params); 
+0

我相信這是的CreateInstance的過載,讓你指定構造函數參數。這將是你最好的選擇。 – Tejs 2010-04-27 17:41:15

+0

這樣可以很好地工作,除非他必須每秒處理數千次,在這種情況下,編譯好的代表會更好。 – Gabe 2010-04-27 17:43:13

+0

我正在尋找一個編譯的委託: - \這將在一個網站上運行,並且如果可能的話,我希望在加載時發生任何性能下降。 – TJMonk15 2010-04-27 17:48:22