2010-06-03 12 views
30

मैं एक वर्ग को निम्न रूप में है:System.Reflection का प्रयोग हो जाओ करने के लिए एक विधि का पूरा नाम

public class MyClass 
{ 

... 

    protected void MyMethod() 
    { 
    ... 
    string myName = System.Reflection.MethodBase.GetCurrentMethod.Name; 
    ... 
    } 

... 

} 

myName का मान "MyMethod" है।

क्या कोई तरीका है कि मैं इसके बजाय myName के लिए "MyClass.MyMethod" का मान प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकता हूं?

+1

सुधार::

static string GetMethodContextName() { var name = new StackTrace().GetFrame(1).GetMethod().GetMethodContextName(); } static string GetMethodContextName(this MethodBase method) { if (method.DeclaringType.GetInterfaces().Any(i => i == typeof(IAsyncStateMachine))) { var generatedType = method.DeclaringType; var originalType = generatedType.DeclaringType; var foundMethod = originalType.GetMethods(Instance | Static | Public | NonPublic | DeclaredOnly) .Single(m => m.GetCustomAttribute<AsyncStateMachineAttribute>()?.StateMachineType == generatedType); return foundMethod.DeclaringType.Name + "." + foundMethod.Name; } else { return method.DeclaringType.Name + "." + method.Name; } } 

यहाँ एक उदाहरण उपयोग यह System.Reflection.MethodBase.GetCurrentMethod किया जाना चाहिए() नाम – aads

उत्तर

50

आप MethodBase की ReflectedType पर दिखाई दे सकता है आप GetCurrentMethod से मिलता है, यानी,

MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); 
string methodName = method.Name; 
string className = method.ReflectedType.Name; 

string fullMethodName = className + "." + methodName; 
+0

मैं वास्तव में क्या देख रहा था।। धन्यवाद! –

+0

बस ध्यान दें कि 'प्रतिबिंबित टाइप' रनटाइम पॉलीमोर्फिज्म के लिए खाता नहीं है जैसा कि किसी ने उम्मीद की हो .. – user2864740

4

विस्तार रूबेन के, तो आप इस तरह पूरा नाम प्राप्त कर सकते हैं:

var info = System.Reflection.MethodBase.GetCurrentMethod(); 
var result = string.Format(
       "{0}.{1}.{2}()", 
       info.ReflectedType.Namespace, 
       info.ReflectedType.Name, 
       info.Name); 

आप इसे जोड़ सकते हैं एक स्थिर विधि के लिए जो एक विधिबेस पैरामीटर प्राप्त करता है और स्ट्रिंग उत्पन्न करता है।

4

आप इस तरह पूरा नाम प्राप्त कर सकते हैं:

var fullMethodName = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName; 
14

और मानकों के साथ पूर्ण विधि नाम पाने के लिए:

var method = System.Reflection.MethodBase.GetCurrentMethod(); 
var fullName = string.Format("{0}.{1}({2})", method.ReflectedType.FullName, method.Name, string.Join(",", method.GetParameters().Select(o => string.Format("{0} {1}", o.ParameterType, o.Name)).ToArray())); 
+0

+1 निश्चित रूप से सबसे उपयोगी समाधान।फुलनाम समेत कक्षा को पिन करने में मदद करता है जब आपके कोड बेस ने अलग-अलग नामस्थानों में कक्षा के नाम दोहराए हैं। और पैरामीटर समेत अधिभारित तरीकों के बीच अंतर करने में मदद करता है। –

2

ऊपर पदों के लिए धन्यवाद, वे मुझे मदद की एक मजबूत बनाने के लिए निम्नानुसार एमवीसी 4 HTMLHelpers के लिए बाध्यकारी प्रणाली टाइप करें।

public static MvcHtmlString StrongTypeBinder(this HtmlHelper htmlhelper, Expression<Func<object, string>> SomeLambda) 
    { 
     var body = SomeLambda.Body; 
     var propertyName = ((PropertyInfo)((MemberExpression)body).Member).Name; 
     HtmlString = @" 
      <input type='text' name='@Id' id='@Id'/> 
      "; 
     HtmlString = HtmlString.Replace("@Id", propertyName); 
     var finalstring = new MvcHtmlString(HtmlString); 
     return finalstring; 

    } 

किसी भी CSHTML दृश्य में इसके बाद के संस्करण कोड का उपयोग करें:

@Html.StrongTypeBinder(p=>Model.SelectedDate) 

यह मैं किसी भी HTML तत्व प्रकार मैं चाहता हूँ करने के लिए एक ViewModel में किसी भी संपत्ति बाध्य करने के लिए अनुमति देता है। ऊपर दिए गए उदाहरण में, उपयोगकर्ता द्वारा चयन किए जाने के बाद पोस्ट किए गए चयनित डेटा के लिए नाम फ़ील्ड बाध्यकारी है। पोस्ट बैक के बाद व्यूमोडेल स्वचालित रूप से चयनित मान दिखाता है।

2

सी # 6 में आप nameof उपयोग कर सकते हैं:

string myName = nameof(MyMethod); 
+1

हां, लेकिन यह सिर्फ नाम देता है, पूरा नाम नहीं। दिए गए उदाहरण में, यह स्ट्रिंग '" MyMethod "', "MyClass.MyMethod" 'नहीं देता है। – Matt

5

मैं इन दिनों लगता है, यह ऐसा करने के लिए सबसे अच्छा है:

string fullMethodName = $"{typeof(MyClass).FullName}.{nameof(MyMethod)}"; 
+1

इस के लिए खोज कर रहे हैं ताकि मैं योग्य नामों को लॉग कर सकूं और यह वह दृष्टिकोण है जिसे मैंने अपनाया है। सिर्फ इसलिए कि यह छोटा, सरल है और मुझे जो चाहिए वह करता है। – onesixtyfourth

0

आप जब async तरीकों के अंदर चल रहे मुद्दों होगा।

आप पूरी तरह से वर्ग के नाम अर्हता प्राप्त करने की जरूरत है, तो आप का उपयोग करने के DeclaringType.FullNameDeclaringType.Name के बजाय

इस कोड को गुमनाम या लैम्ब्डा तरीकों के लिए अच्छी तरह से काम नहीं करेगा होगा: यहाँ ठीक करने का तरीका है कि है।

class Program { 
    static void Main(string[] args) { 
     // outputs Program.Main 
     Console.WriteLine(GetMethodContextName()); 
    } 
} 
संबंधित मुद्दे