究竟如何做的問題清單?由於C#表達式編譯器(在上面的LINQ中使用)使用成員信息令牌直接(而不是依靠字符串作爲反射),我看不出你可以做得更好。同樣,假設它是一個IL混淆器(不是源混淆器),重寫它作爲查詢表達式應該什麼都不會,nix,zip,零和nada。你可以嘗試...
var first = (from f in [whatever]
where f.FileName == fileName
orderby f.Position descending
select f).FirstOrDefault();
究竟發生了什麼?
編輯基於註釋:如果問題是「捕獲」,你可以嘗試手動構建表達以恆定的(而不是捕捉值) - 在Foo
是你喜歡的類型:
var param = Expression.Parameter(typeof(Foo), "f");
var body = Expression.Equal(Expression.PropertyOrField(param, "FileName"),
Expression.Constant(filename));
var predicate = Expression.Lambda<Func<Foo, bool>>(body, param);
然後使用:
.Where(predicate).OrderByDescending(f => f.Position).FirstOrDefault();
的問題,當然是說服它說:「文件名」和Foo.FileName
必須保持不變...
下面是不需要的字符串版本:
Expression<Func<Foo, string>> liftFileName = foo => foo.FileName;
var predicate = Expression.Lambda<Func<Foo, bool>>(
Expression.Equal(liftFileName.Body, Expression.Constant(filename)),
liftFileName.Parameters);
當我做一個發佈版本,對於混淆後生成事件失敗,參照未定義類,和另一個錯誤 - 輸入文件的處理過程中「[的SourceFile]」發生錯誤 - > ilasm.exe :警告 - 嵌套類具有非嵌套可見性(0x00000001),更改爲嵌套(0x00000002)。 – 2010-04-29 12:04:50
@JL - 嗯...聽起來像「文件名」捕獲 - 我們*可能*能夠解決這個問題;兩秒鐘... – 2010-04-29 12:06:13
看起來像你的LINQ有與原來相同的問題。完全相同的錯誤。我也決定在集合中做一個快速的空foreach循環,並且表現和編譯。 – 2010-04-29 12:10:48