2012-05-16 50 views
2

我工作的一個簡單的ORM庫,其實也挺簡單的設置一般對象的屬性...反思:使用委託

我有T類型的查詢

public IEnumerable<T> Query<T>(string query) 

的方法採用T艙,它得到的屬性,通過他們循環,並將其設置相應

aProperty.SetValue(tmpGenericObjectOfTypeT, newValue, null); 

我的問題是,是的SetValue慢得令人難以置信,我看到了兩個備選方案,使用Reflection.Emit的,或者使用代表們,不幸的是我不知道如何去做任何這些。

正如我所讀到的,使用委託更優雅一點,我想這個解決方案,但我真的不知道該怎麼做,我搜索了很多關於如何調用使用代表的方法,但不是如何設置屬性...

+0

除非你已經知道你的財產的名稱代表不會真的幫你。由於您想在運行時執行此操作,因此無法通過Reflection.Emit或使用ExpressionTree進行反射或元編程。既不愉快,但你如果你想要更多的表現,那麼你將不得不硬着頭皮。 – Josh

+0

看起來像散發它。謝謝。如果我讓它們實現一個基類,它是行不通的,所以我知道委託的名字? – gosukiwi

回答

1

Dynamic methodsexpression trees哪些知道如何獲取/設置屬性是去這裏的方式。快速和容易。

  • 使用反射
  • 生成的getter/setter Actions/Funcs檢查你的類型的接口,並且其中它們涉及原始類型的對象緩存。
  • 在後續操作中使用緩存的getter/setter。

您應該看到反射效果至少提高了20倍(如果不是更像是50-100x)。

+0

看起來像表達樹不使用發射,這將是一個不錯的選擇,因爲我沒有想法hwo使用它。非常感謝!任何提示,我可以在哪裏閱讀更多關於表達樹的信息? – gosukiwi

+0

我包含的鏈接是一個好的開始,並且SO上至少有一些表達式樹大師。如果您找不到現有的答案,只需打開一個新問題。 –

+0

這可能是一個好的開始:http://stackoverflow.com/a/10620873/453277 –