it-swarm.com.de

System.Reflection verwenden, um den vollständigen Namen einer Methode zu erhalten

Ich habe eine Klasse, die wie folgt aussieht:

public class MyClass
{

...

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

...

}

Der Wert von myName lautet "MyMethod". 

Gibt es eine Möglichkeit, mit Reflection einen Wert von "MyClass.MyMethod" für myName zu erhalten?

36
Onion-Knight

Sie könnten sich die ReflectedType der MethodBase ansehen, die Sie von GetCurrentMethod erhalten, d. H.

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

string fullMethodName = className + "." + methodName;
59
Ruben

Und um den vollständigen Methodennamen mit Parametern zu erhalten:

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()));
19
mms

Wenn Sie Ruben erweitern, können Sie den vollständigen Namen folgendermaßen erhalten:

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

Sie können es einer statischen Methode hinzufügen, die einen MethodBase-Parameter empfängt und die Zeichenfolge generiert.

6
JoanComasFdz

Ich denke, in diesen Tagen ist es am besten, dies zu tun:

string fullMethodName = $"{typeof(MyClass).FullName}.{nameof(MyMethod)}";
6
Peter Kottas

In C # 6 können Sie nameof verwenden:

string myName = nameof(MyMethod);
4
Salar

Sie können den vollständigen Namen wie folgt erhalten:

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

Vielen Dank für die obigen Beiträge. Sie haben mir geholfen, ein starkes Typbindungssystem für MVC 4 HTMLHelpers wie folgt zu erstellen.

 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;

    }

So verwenden Sie den obigen Code in einer beliebigen CSHTML-Ansicht:

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

Dadurch kann ich jede Eigenschaft in einem ViewModel an jeden gewünschten HTML-Elementtyp binden. Im obigen Beispiel binde ich das Namensfeld für die ausgewählten Daten, nachdem der Benutzer eine Auswahl getroffen hat. Das Ansichtsmodell nach dem Post Back zeigt automatisch den ausgewählten Wert.

2
John Peters

Wenn Sie async-Methoden ausführen, treten Probleme auf. So beheben Sie das: 

Wenn Sie den Klassennamen vollständig qualifizieren müssen, müssen Sie DeclaringType.FullName anstelle von DeclaringType.Name verwenden.

Dieser Code funktioniert nicht gut für anonyme oder Lambda-Methoden.

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

Hier ein Beispiel: 

class Program { 
    static void Main(string[] args) {
        // outputs Program.Main
        Console.WriteLine(GetMethodContextName());
    }
}
0
bboyle1234