Compact Framework 3.5上的MethodBase.GetCurrentMethod()的解决方法

时间:2009-03-12 15:51:28

标签: .net linq generics reflection compact-framework

我想在.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()。

我寻找一些方便的解决方案如何解决它。

1 个答案:

答案 0 :(得分:1)

请参阅this discussion

在Compact Framework 1.0中的普通托管代码中基本上是不可能的。

在2.0中它是可能但容易出错,脆弱,最重要的是不保证是正确的(严重的缺陷)。

我建议改为编写一个可以找到“((MethodInfo)MethodBase.GetCurrentMethod())”的所有实例的宏,并确定它们所在的方法。

简单地转换每一行

".*\(\(MethodInfo\)MethodBase\.GetCurrentMethod\(\)\).*"

要 抛出新的异常((MethodInfo)MethodBase.GetCurrentMethod())。Name);

  • 编译非紧凑框架(手工修复正则表达式替换破坏的位置,应该不会很多)
  • 运行反射发生替换的类中的每个方法
  • 捕获生成的异常并打印消息(方法名称)和堆栈跟踪的第一行。

然后,这将为您提供一个列表,列出您需要直接在每个呼叫站点放入的内容(可能由一个懒惰创建的静态字段备份,每个字段都包含MethodInfo。

这很麻烦,但作为一次性动作预框架更新可能会相当不错,但说实话,它可能会快速完成并手动执行。