我試圖弄清楚如何從代表動作“語句”行的字符串集合中生成一個動作......using System.Linq.Dynamic;Action<T> BuildAction<T>(T sourceObject, T destinationObject) where T : BaseThing{ var source = Expression.Parameter(sourceObject.GetType(), "source"); var destination = Expression.Parameter(destinationObject.GetType(), "destination"); var statements = new[] { "destination.Foo = source.Foo", "destination.X = source.Y" }; var parsedStatements = statements.Select(s => DynamicExpression.Parse(new[] { destination, source }, typeof(void), s); return Expression.Lambda<Action<T>>(Expression.Block(parsedStatements));}這個想法是最終得到類似......Action<T> result = (destination, source) => { destination.Foo = source.Foo; destination.X = source.Y;};我的另一個問題是源和目標不必是相同的類型,它們只共享一個基類型,所以在這個例子中,目標可能沒有 Y 屬性,源可能沒有 X 屬性(因此映射)。
1 回答

守著一只汪
TA貢獻1872條經驗 獲得超4個贊
所以事實證明,這個問題的答案并不像我希望的那么簡單。簡而言之......我需要編寫一個表達式解析器。
對于最簡單的情況(問題中提出的情況),我可以在我的部分解決方案中使用代碼,但對于完整的解決方案,我將不得不構建一個表達式解析器,該解析器可以處理放入字符串中的更多復雜性.
就我而言,使用字典或類似方法只能解決一部分潛在問題,我不能使用反射,因為我的情況需要“大規模重用已編譯的操作”(我在問題中略有提及)。
我可以參考一系列問題的答案來解決這個問題的各個部分,但我設法找到了一個更“完整”的起點,以實現我在其他地方嘗試實現的目標......
https://archive.codeplex.com/?p=simproexpr
...這個例子不僅可以解析表達式,還可以解析表達式塊。
使用那個/類似的東西,我將沿著這些方向構建一些東西來解決我的問題,我希望這可以幫助其他人。
- 1 回答
- 0 關注
- 210 瀏覽
添加回答
舉報
0/150
提交
取消