2010-06-03 21 views
30

我有一個類,如下所示:使用的System.Reflection獲取一個方法的全名

public class MyClass 
{ 

... 

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

... 

} 

myName值爲「的MyMethod」。

有沒有一種方法可以使用Reflection來取代myName的「MyClass.MyMethod」值?

+1

更正:應該System.Reflection.MethodBase.GetCurrentMethod()名稱 – aads 2013-09-26 06:33:05

回答

50

你可以看看MethodBaseReflectedTypeGetCurrentMethod獲得,即

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

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

正是我一直在尋找的。謝謝! – 2010-06-03 18:16:20

+0

只需注意'ReflectedType'不會像人們所期望的那樣解決運行時多態性問題。 – user2864740 2016-11-07 03:43:01

4

擴展魯本的,你可以得到全名是這樣的:

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

您可以將其添加轉換爲接收MethodBase參數並生成字符串的靜態方法。

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絕對是最有用的解決方案。包含FullName有助於在您的代碼庫在不同名稱空間中重複類名時查明類。並且包含參數有助於區分重載的方法。 – 2015-02-05 16:18:24

2

感謝以上的職位,他們幫助我建立一個強大的MVC 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元素類型。在上面的示例中,我綁定了用戶選擇後回發的所選數據的名稱字段。發佈後的視圖模型會自動顯示選定的值。

2

在C#6你可以用nameof

string myName = nameof(MyMethod); 
+1

是的,但是隻返回名稱,而不是全名。在給出的例子中,它返回字符串「MyMethod」而不是「MyClass.MyMethod」。 – Matt 2016-05-30 12:00:13

5

我想這些天,最好這樣做:

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

一直在尋找這個,所以我可以登錄合格的名字,這是我最終採用的方法。僅僅因爲它很小,很簡單,並且做我需要的東西。 – onesixtyfourth 2018-03-06 07:57:26

0

異步方法中運行時,您將有問題。以下是如何解決這個問題:

如果您需要完全限定類名,你將不得不使用的DeclaringType.FullName代替DeclaringType.Name

此代碼不能用於匿名或lambda方法很好地工作。

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; 
    } 
} 

下面是一個例子用法:

class Program { 
    static void Main(string[] args) { 
     // outputs Program.Main 
     Console.WriteLine(GetMethodContextName()); 
    } 
} 
相關問題