代码之家  ›  专栏  ›  技术社区  ›  TcKs

Compact Framework 3.5上MethodBase.GetCurrentMethod()的变通方法

  •  2
  • TcKs  · 技术社区  · 17 年前

    我想在.NET Compact Framework上的项目中使用Linq IQueryable工具包。 CF中的Linq功能有点变形,即:IQueryable接口不可用。所以我找到了第三方库,它实现了我所需要的缺失功能。

    原始代码示例:

    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 ) } ) );
    }
    

    可行的解决方案是用特定的方法调用替换“(MethodInfo)MethodBase.GetCurrentMethod()”。例如:GetMethod_Any_TSource_On_Source()和GetMethod_Any_TSource_On_Source_With_Predicate_TSource_Bool()。

    1 回复  |  直到 17 年前
        1
  •  1
  •   ShuggyCoUk    17 年前

    看见 this discussion

    在Compact Framework 1.0中的纯托管代码中,这基本上是不可能的。

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

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

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

    到

    • 运行类中通过反射进行替换的每个方法
    • 捕获结果异常并打印消息(方法名称)和堆栈跟踪的第一行。

    这很麻烦,但作为一次性操作的框架前更新可能会运行得相当好,不过老实说,手动完成更新也可能同样快。

    推荐文章