Soluție pentru MethodBase.GetCurrentMethod () pe Compact Framework 3.5

voturi
2

Vreau folosesc un LINQ IQueryable Toolkit în proiectul pe NET Framework Compact. Capacitățile LINQ în CF este puțin shapred - și anume: interfață IQueryable nu este disponibilă. Așa că am găsit biblioteci terță parte, care implementează funcționalitatea lipsește ceea ce am nevoie.

Acum am o problemă cu metoda lipsă „MethodBase.GetCurrentMethod ()“. Există cca 100 de metode, care utilizează această metodă. Deci, nu am nevoie de clona exacta „GetCurrentMethod ()“. Modul în soluție alternativă pentru această caz ​​specific este suficient.

Exemplu de cod 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 ) } ) );
}

Soluția este înlocui posibile „(MethodInfo) MethodBase.GetCurrentMethod ()“ cu apel metoda specifica. De exemplu: GetMethod_Any_TSource_On_Source () și GetMethod_Any_TSource_On_Source_With_Predicate_TSource_Bool ().

Am căuta o anumită soluție la îndemână cum să o rezolve.

Întrebat 12/03/2009 la 14:51
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
1

A se vedea această discuție

Este, în esență, imposibil în cod gestionat simplu în Compact Framework 1.0.

În 2.0 este posibil, dar predispuse la erori, fragil și cel mai important, nu sunt garantate de a fi corect (un defect grav).

Aș sugera în loc să scrie un macro care poate găsi toate instanțele „((MethodInfo) MethodBase.GetCurrentMethod ())“ și determinte metoda în care locuiesc.

Pur și simplu de conversie în fiecare linie, astfel cum ar fi

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

pentru a arunca noi excepții ((MethodInfo) MethodBase.GetCurrentMethod ()) Name).;

  • Compilați pentru cadrul compact non (fixare manual locațiile pe care regex înlocui rupt, nu ar trebui să fie mai multe)
  • Rulați fiecare metodă în clasele în care înlocuirile sa întâmplat prin reflexie
  • captura excepțiile care rezultă și tipări mesajul (denumirea metodei) și prima linie a urmelor din stivă.

Acest lucru, atunci vă oferă o listă cu ceea ce ai nevoie pentru a pune în mod direct la fiecare loc de apel (probabil, susținută de un câmp static creat alene care deține MethodInfo pentru fiecare dintre ele.

Acest lucru este greoaie, dar s-ar putea lucra destul de bine ca o actualizare cadru pre unice de acțiune, deși pentru a fi sincer ar putea fi la fel de rapid pentru a trece prin și fă-o cu mâna.

Publicat 22/04/2009 la 17:19
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more