我想在.NET Compact Framework的项目中使用Linq IQueryable Toolkit。 CF中的Linq功能有点琐碎 - 即:IQueryable接口不可用。所以我找到了第三方库,它实现了我需要的功能。
现在我遇到了丢失方法“MethodBase.GetCurrentMethod()”的问题。有cca 100方法,它使用这种方法。所以我不需要“GetCurrentMethod()”的确切克隆。针对这种特定情况的解决方法就足够了。
原始代码示例:
public static bool Any<TSource>( this IQueryable<TSource> source ) {
return source.Provider.Execute<bool>( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod( new Type[] { typeof( TSource ) } ), new Expression[] { source.Expression } ) );
}
public static bool Any<TSource>( this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate ) {
return source.Provider.Execute<bool>( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod( new Type[] { typeof( TSource ) } ), new Expression[] { source.Expression, Expression.Quote( predicate ) } ) );
}
posibile解决方案是用特定的方法调用替换“(MethodInfo)MethodBase.GetCurrentMethod()”。例如:GetMethod_Any_TSource_On_Source()和GetMethod_Any_TSource_On_Source_With_Predicate_TSource_Bool()。
我寻找一些方便的解决方案如何解决它。
答案 0 :(得分:1)
在Compact Framework 1.0中的普通托管代码中基本上是不可能的。
在2.0中它是可能但容易出错,脆弱,最重要的是不保证是正确的(严重的缺陷)。
我建议改为编写一个可以找到“((MethodInfo)MethodBase.GetCurrentMethod())”的所有实例的宏,并确定它们所在的方法。
简单地转换每一行
".*\(\(MethodInfo\)MethodBase\.GetCurrentMethod\(\)\).*"
要 抛出新的异常((MethodInfo)MethodBase.GetCurrentMethod())。Name);
然后,这将为您提供一个列表,列出您需要直接在每个呼叫站点放入的内容(可能由一个懒惰创建的静态字段备份,每个字段都包含MethodInfo。
这很麻烦,但作为一次性动作预框架更新可能会相当不错,但说实话,它可能会快速完成并手动执行。