आपके कोड के साथ समस्या public bool MethodHasAuthorizeAttribute(Func<int, ActionResult> function)
का हस्ताक्षर है। MethodHasAuthorizeAttribute
केवल आपके द्वारा निर्दिष्ट प्रतिनिधि के हस्ताक्षर से मेल खाते तर्कों के साथ उपयोग किया जा सकता है। इस मामले में को int
के पैरामीटर के साथ ActionResult
लौटने का एक तरीका।
जब आप इस विधि को MethodHasAuthorizeAttribute(controller.Method3)
कहते हैं, तो कंपाइलर एक विधि समूह रूपांतरण करेगा। यह हमेशा वांछित नहीं हो सकता है और अप्रत्याशित परिणाम उत्पन्न कर सकता है (विधि समूह रूपांतरण हमेशा straigthforward नहीं हैं)। यदि आप MethodHasAuthorizeAttribute(controller.Method1)
पर कॉल करने का प्रयास करते हैं तो आपको एक कंपाइलर त्रुटि मिलेगी क्योंकि कोई रूपांतरण नहीं है।
अभिव्यक्ति पेड़ों और प्रसिद्ध "विधिऑफ" चाल के साथ एक और सामान्य समाधान बनाया जा सकता है। यह मंगलाचरण लक्ष्य को खोजने के लिए संकलक उत्पन्न अभिव्यक्ति पेड़ को रोजगार:
public static MethodInfo MethodOf(Expression<System.Action> expression)
{
MethodCallExpression body = (MethodCallExpression)expression.Body;
return body.Method;
}
आप इसे इस तरह उपयोग कर सकते हैं, लेकिन यह भी किसी भी विधि के साथ इस्तेमाल किया जा सकता:
MethodInfo method = MethodOf(() => controller.Method3(default(int)));
इसी के साथ
रास्ते से बाहर, हम एक सामान्य कार्यान्वयन का निर्माण कर सकते हैं:
public static bool MethodHasAuthorizeAttribute(Expression<System.Action> expression)
{
var method = MethodOf(expression);
const bool includeInherited = false;
return method.GetCustomAttributes(typeof(AuthorizeAttribute), includeInherited).Any();
}
ठीक है, विधियों के लिए यह है। अब, यदि आप कक्षाओं या फ़ील्ड पर विशेषता चेक लागू करना चाहते हैं (मैं गुणों को छोड़ दूंगा क्योंकि वे वास्तव में विधियां हैं), हमें MemberInfo
पर हमारी जांच करने की आवश्यकता है, जो Type
, FieldInfo
और MethodInfo
के लिए विरासत रूट है। एक अलग विधि में गुण खोज निकालने और अच्छा नाम के साथ उचित एडाप्टर तरीकों प्रदान करने के रूप यह उतना आसान:
public static bool MethodHasAuthorizeAttribute(Expression<System.Action> expression)
{
MemberInfo member = MethodOf(expression);
return MemberHasAuthorizeAttribute(member);
}
public static bool TypeHasAuthorizeAttribute(Type t)
{
return MemberHasAuthorizeAttribute(t);
}
private static bool MemberHasAuthorizeAttribute(MemberInfo member)
{
const bool includeInherited = false;
return member.GetCustomAttributes(typeof(AuthorizeAttribute), includeInherited).Any();
}
मैं एक व्यायाम के रूप क्षेत्रों के लिए कार्यान्वयन छोड़ देंगे, तो आप MethodOf रूप में एक ही चाल को रोजगार कर सकते हैं।
क्या आप यह जांचना चाहते हैं कि कक्षा, विधि या संपत्ति में एक सामान्य विधि के भीतर ऐसी विशेषता है या नहीं? –
क्या आप यह जानना चाहते हैं कि किसी विधि के पास एक निश्चित प्रकार की विशेषता है या नहीं? – Rajesh
मैं यह जांचना चाहता हूं कि विधि में एक विशेष विशेषता सेट है या नहीं, लेकिन मैं एक स्ट्रिंग के रूप में एक विधि नाम पास नहीं करना चाहता हूं। – 4rchie