Aquí podría ser tu PUBLICIDAD


Solución para MethodBase.GetCurrentMethod () en Compact Framework 3.5

votos
2

Deseo utilizar un Linq IQueryable Toolkit en proyecto en .NET Compact Framework. Las capacidades de Linq en CF están un poco fragmentadas, es decir: la interfaz IQueryable no está disponible. Así que encontré bibliotecas de terceros, que implementan la funcionalidad faltante de lo que necesito.

Ahora tengo un problema con el método que falta MethodBase.GetCurrentMethod (). Hay métodos cca 100, que usan este método. Por lo tanto, no necesito el clon exacto de GetCurrentMethod (). La forma de solución para este caso específico es suficiente.

Muestra de código original:

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

La solución posibile es replace (MethodInfo) MethodBase.GetCurrentMethod () con una llamada a método específico. Por ejemplo: GetMethod_Any_TSource_On_Source () y GetMethod_Any_TSource_On_Source_With_Predicate_TSource_Bool ().

Busco alguna solución práctica para resolverlo.

Publicado el 12/03/2009 a las 16:51
fuente por usuario TcKs
En otros idiomas...        العربية       

1 respuestas

votos
1

Ver esta discusión

Es esencialmente imposible en el código administrado simple en Compact Framework 1.0.

En 2.0 es posible pero propenso a errores, frágil y lo más importante NO garantizado que sea correcto (un defecto grave).

Sugeriría en su lugar escribir una macro que pueda encontrar todas las instancias de "((MethodInfo) MethodBase.GetCurrentMethod ())" y determinar el método en el que residen.

Simplemente convirtiendo cada línea como tal

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

lanzar nueva Excepción ((MethodInfo) MethodBase.GetCurrentMethod ()). Name);

  • Compilar para el marco no compacto (arreglando a mano las ubicaciones en las que se reemplazó la regex, no debería haber muchas)
  • Ejecutar todos los métodos en las clases donde sucedieron los reemplazos por reflexión
  • capte las excepciones resultantes e imprima el mensaje (nombre del método) y la primera línea del seguimiento de la pila.

Esto le proporciona una lista de lo que necesita colocar directamente en cada sitio de llamada (probablemente respaldado por un campo estático creado de forma perezosa que contiene MethodInfo para cada uno).

Esto es engorroso, pero podría funcionar razonablemente bien como una actualización previa al marco de trabajo de una sola vez, aunque para ser sincero, puede ser igual de rápido y hacerlo a mano.

Respondida el 22/04/2009 a las 07:19
fuente por usuario ShuggyCoUk


Aquí podría ser tu PUBLICIDAD