कम्पैक्ट फ्रेमवर्क 3.5 पर MethodBase.GetCurrentMethod () के लिए युक्ति

वोट
2

मैं NET कम्पैक्ट फ्रेमवर्क पर परियोजना में एक Linq IQueryable टूलकिट का उपयोग करना चाहते हैं। सीएफ में Linq क्षमताओं छोटा सा shapred है - अर्थात्: IQueryable इंटरफेस उपलब्ध नहीं है। तो मैं तीसरे पक्ष के पुस्तकालयों, जो लापता कार्यक्षमता मैं क्या जरूरत है लागू करता है पाया है।

अब मैं लापता विधि MethodBase.GetCurrentMethod () के साथ समस्या है। वहाँ सीसीए 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 ()।

मैं कुछ आसान समाधान है कि यह कैसे हल करने के लिए के लिए खोज।

12/03/2009 को 16:51
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
1

देखें इस चर्चा

यह कम्पैक्ट फ्रेमवर्क 1.0 में सादे प्रबंधित कोड में अनिवार्य रूप से असंभव है।

2.0 में यह संभव है, लेकिन त्रुटियों की संभावना, नाजुक और सबसे महत्वपूर्ण बात नहीं की गारंटी सही होने के लिए (एक गंभीर दोष) है।

मैं बजाय का सुझाव एक मैक्रो जिनमें से "((MethodInfo) MethodBase.GetCurrentMethod ())" सभी उदाहरणों खोजने के लिए और तरीका है जिसमें वे रहते हैं determinte कर सकते हैं लिख होगा।

सीधे शब्दों में तो जैसे हर पंक्ति परिवर्तित

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

। नया अपवाद ((MethodInfo) MethodBase.GetCurrentMethod ()) नाम) फेंक करने के लिए;

  • गैर कॉम्पैक्ट फ्रेमवर्क के लिए संकलित (हाथ स्थानों कि regex तोड़ दिया की जगह द्वारा फिक्सिंग, वहाँ कई नहीं होना चाहिए)
  • कक्षाओं में हर विधि जहां प्रतिस्थापन प्रतिबिंब द्वारा हुआ भागो
  • जिसके परिणामस्वरूप अपवादों को पकड़ने और संदेश (विधि नाम) और स्टैक ट्रेस की पहली पंक्ति मुद्रित करें।

यह तो तुम क्या आप प्रत्येक कॉल साइट (शायद एक lazily बनाई स्थिर क्षेत्र हर एक के लिए MethodInfo पकड़े द्वारा समर्थित पर सीधे में डाल करने की जरूरत है की एक सूची देता है।

यह बोझिल है, लेकिन एक कार्रवाई एक बंद पूर्व ढांचे अद्यतन के रूप में काफी अच्छा काम कर सकते हैं, हालांकि ईमानदार यह बस के रूप में के माध्यम से जाने के लिए जल्दी हो सकता है हो सकता है और हाथ से यह करने के लिए।

22/04/2009 को 19:19
का स्रोत उपयोगकर्ता

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