Comment trouver le nom complet de la méthode d'appel C#
Comment puis-je trouver le nom complet d'une méthode d'appel dans c#. J'ai vu des solutions:
Comment obtenir les méthodes d'appel en C#
Comment puis-je trouver la méthode qui a appelé la méthode actuelle?
Obtenir de l'Appel nom de fonction Appelle la fonction
<!-Mais ils ne me donnent que le niveau supérieur. Prenons l'exemple:namespace Sandbox
{
class Program
{
static void Main(string[] args)
{
test();
}
static void test()
{
var stackTrace = new StackTrace();
var methodBase = stackTrace.GetFrame(1).GetMethod();
Console.WriteLine(methodBase.Name);
}
}
}
il s'agit simplement de sortir 'Main' Comment puis-je l'imprimer Bac à sable.Programme.Main'?
avant que quelqu'un commence à me demander pourquoi j'ai besoin d'utiliser ceci, c'est pour un cadre de journalisation simple sur lequel je travaille.
EDIT
ajouter à la réponse de Matzi:
Voici la solution:
namespace Sandbox
{
class Program
{
static void Main(string[] args)
{
test();
}
static void test()
{
var stackTrace = new StackTrace();
var methodBase = stackTrace.GetFrame(1).GetMethod();
var Class = methodBase.ReflectedType;
var Namespace = Class.Namespace; //Added finding the namespace
Console.WriteLine(Namespace + "." + Class.Name + "." + methodBase.Name);
}
}
}
Produit " Bac À Sable.Programme."Comme il se doit
5 réponses
je pense que le meilleur moyen d'obtenir le nom complet est:
this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name;
ou bien
string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name);
et si vous souhaitez afficher le plus récent appel de fonction, vous pouvez utiliser:
StackTrace st = new StackTrace();
StackFrame sf = st.GetFrame(0);
var methodName = sf.GetMethod();
, mais si vous voulez afficher l'arbre des appels de fonctions, vous pouvez le faire comme ceci:
if (st.FrameCount >1)
{
// Display the highest-level function call
// in the trace.
StackFrame sf = st.GetFrame(st.FrameCount-1);
Console.WriteLine(" Original function call at top of call stack):");
Console.WriteLine(" {0}", sf.GetMethod());
}
pour plus d' info
System.Reflection.MethodBase
méthode GetCurrentMethod
Vous pouvez trouver toutes les informations sur callstack en utilisant les classes etc
Avec cette méthode vous pouvez obtenir de façon fiable le nom complet
public void HandleException(Exception ex, [CallerMemberName] string caller = "")
{
if (ex != null)
{
while (ex.InnerException != null)
ex = ex.InnerException;
foreach (var method in new StackTrace().GetFrames())
{
if (method.GetMethod().Name == caller)
{
caller = $"{method.GetMethod().ReflectedType.Name}.{caller}";
break;
}
}
Console.WriteLine($"Exception: {ex.Message} Caller: {caller}()");
}
}
namespace appelant courant qui n'est pas égal à namespace
var mNamespace = new StackTrace().GetFrames()?.Select(x =>
{
try
{
return x.GetMethod().ReflectedType?.Namespace;
}
catch (Exception)
{
return string.Empty;
}
}).First(x => x != new StackTrace().GetFrame(0).GetMethod().ReflectedType?.Namespace);