我有一個LambdaExpression,它將一個對象作爲參數並最終返回一個對象。 出於測試的目的,這裏是一個Lambda(創建longhand以匹配我真正傳入的內容),它返回一個DateTime作爲對象裝箱。 爲了達到此目的,LambdaExpression需要一個XmlNode並返回一個對象。 它必須返回一個對象,真正的返回類型可能是以下任何一種:DateTime,bool,int,decimal,XmlDocument [到目前爲止] 一般的想法是,在解析器深處,創建這個lambda,並提取一個值從它的輸入參數並返回它鍵入,但盒裝在一個對象。Expression.LessThan vs LambdaExpression <Func <ParamType,object >>
XmlNode node = null;
ParameterExpression instanceExpression = Expression.Parameter(typeof(DynamicNode), "instance");
ParameterExpression result = Expression.Parameter(typeof(object), "result");
LabelTarget blockReturnLabel = Expression.Label(typeof(object));
BlockExpression block = Expression.Block(
typeof(object),
new[] { result },
Expression.Assign(result, Expression.Convert(Expression.Constant(DateTime.Now.AddSeconds(-1)), typeof(object))),
Expression.Return(blockReturnLabel, result),
Expression.Label(blockReturnLabel, Expression.Constant(-2, typeof(object))));
LambdaExpression lax = Expression.Lambda<Func<XmlNode, object>>(block, instanceExpression);
稍後在代碼中,我們正在評估<,< =,>,> =,==和!=,所以我們希望這個LambdaExpression結果
通常比較另一種表達方式,我們可以假設LambdaExpression位於右側的Expression.LessThan 的左側,可能幾乎是任何表達式,但讓我們假設它是鍵入的。 這意味着它可以是ConstantExpression或類似的...但它有一個類型。
這意味着Expression.LessThan [例如]失敗,因爲當它調用Expression.Invoke時,LambdaExpression返回一個對象,而RHS是任何類型。
假設從LambdaExpression返回的對象內裝入的類型實際上與右側的類型相當;例如
(object)5 < 6
如何編寫表達式,可以將盒裝類型與非盒裝類型進行比較而不會崩潰? 我試過linqpad中的各種排列,包括試圖在普通的c#中寫這個 - 即沒有表達式,只是嵌套if-then-else但是我無法讓這個工作很正確。 通常情況下,我可能會寫這樣的事:
/*
int i = 3;
object o = (object)i;
int compare = 4;
*/
DateTime dt = DateTime.Now;
object o = (object)dt;
DateTime compare = DateTime.Now.AddSeconds(1);
bool b = false;
if(o.GetType().IsAssignableFrom(compare.GetType()))
{
if(o is int)
{
b = (int)o < (int)(object)compare;
}
if(o is DateTime)
{
b = (DateTime)o < (DateTime)(object)compare;
}
if(o is decimal)
{
b = (decimal)o < (decimal)(object)compare;
}
}
Console.WriteLine(b);
有了這個,假設O和比較實際上是同一類型,其中一人被裝箱爲對象,我們仍然可以執行<操作.. 。
所以我想我的問題是,當我在左邊有一個LambdaExpression,並且右邊的表達式[如果兩個不是相同的類型,假的結果比碰撞]
希望有人能幫到,
加雷思
運作Em..I大概覺得OP喜歡內比較邏輯這樣的表達。 – 2011-02-25 11:45:02
好吧,這有助於 - 因此Expression.Condition與Expression.IfThenElse類似,據我所知 - 它是否與Ternary bool更相似? true:false – 2011-02-25 11:46:14
他可能想要一個表達式來比較它們,而不是比較結果,我誤解了。 – 2011-02-25 11:47:03