हाँ बिलकुल।
यदि आप किसी वस्तु को हेरफेर करना चाहते हैं तो मैं वास्तव में इस तरह से एक फ़ंक्शन का उपयोग करता हूं:
public static T CreateWrapper<T>(Exception innerException, params object[] parameterValues) where T : Exception, new()
{
if (parameterValues == null)
{
parameterValues = new object[0];
}
Exception exception = null;
StringBuilder builder = new StringBuilder();
MethodBase method = new StackFrame(2).GetMethod();
ParameterInfo[] parameters = method.GetParameters();
builder.AppendFormat(CultureInfo.InvariantCulture, ExceptionFormat, new object[] { method.DeclaringType.Name, method.Name });
if ((parameters.Length > 0) || (parameterValues.Length > 0))
{
builder.Append(GetParameterList(parameters, parameterValues));
}
exception = (Exception)Activator.CreateInstance(typeof(T), new object[] { builder.ToString(), innerException });
return (T)exception;
}
यह रेखा:
MethodBase method = new StackFrame(2).GetMethod();
कॉलिंग विधि खोजने के लिए स्टैक फ्रेम पर चलता है फिर हम जेनेरिक त्रुटि रिपोर्टिंग फ़ंक्शन के लिए पैरामीटर सूचना मान प्राप्त करने के लिए प्रतिबिंब का उपयोग करते हैं। वर्तमान विधि को प्राप्त करने के लिए बस इसके बजाय वर्तमान स्टैक फ्रेम (1) का उपयोग करें।
जैसा कि अन्य लोगों ने कहा है कि वर्तमान विधियों के नाम के लिए भी आप उपयोग कर सकते हैं:
MethodBase.GetCurrentMethod()
मैं स्टैक घूमना पसंद करता हूं क्योंकि अगर उस तरीके से आंतरिक रूप से देखें तो यह वैसे भी एक StackCrawlMark बनाता है। सीधे तौर पर स्टैक को संबोधित करना मुझे स्पष्ट लगता है
4.5 पद अब आप विधि के नाम की एक स्ट्रिंग प्राप्त करने के लिए विधि पैरामीटर के भाग के रूप में [CallerMemberNameAttribute] का उपयोग कर सकते हैं - यह कुछ परिदृश्यों में मदद कर सकता है (लेकिन वास्तव में ऊपर उदाहरण में कहें)
public void Foo ([CallerMemberName] string methodName = null)
यह मुख्य रूप से INotifyPropertyChanged समर्थन के लिए एक समाधान प्रतीत होता है, जहां पहले आपने अपने ईवेंट कोड के माध्यम से सभी तार बिछाए थे।