J'ai la structure de classe ci-dessous. La classe A est appelée depuis le constructeur des classes B et C.
Class A { A() } Class B { B() { A(); } } Class C { C() { A(); } }
Y a-t-il un moyen de savoir si l'appel à A () vient de B () ou C ()? Je ne veux passer aucun objet dans le constructeur.
3 Réponses :
Vous pouvez utiliser CallerMemberNameAttribute
pour obtenir le nom de l'appelant. Veuillez consulter l'exemple suivant ici a >. J'espère que cela vous aidera. public void DoProcessing()
{
TraceMessage("Something happened.");
}
public void TraceMessage(string message,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
System.Diagnostics.Trace.WriteLine("message: " + message);
System.Diagnostics.Trace.WriteLine("member name: " + memberName);
System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}
// Sample Output:
// message: Something happened.
// member name: DoProcessing
// source file path: c:\Visual Studio Projects\CallerInfoCS\CallerInfoCS\Form1.cs
// source line number: 31
Cela a fonctionné pour moi
var mth = new StackTrace().GetFrame(1).GetMethod(); var cls = mth.ReflectedType.Name;
Vous avez besoin de CallerMemberNameAttribute ou CallerFilePathAttribute . Veuillez consulter la documentation de Microsoft pour plus de détails https://docs.microsoft.com/ fr-fr / dotnet / csharp / guide-de-programmation / concepts / informations sur l'appelant
CallerMemberName is CallFirstClass. Calling from D:\Development\WpfApp1\WpfApp1\SecondClass.cs
la sortie dans CallFirstClass () serait comme ceci
public class FirstClass { public string Run([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "") { return $"CallerMemberName is {memberName}. Calling from {sourceFilePath}"; } } public class SecondClass { public string CallFirstClass() { var firstClass = new FirstClass(); return firstClass.Run(); } }
Cela peut être utile: stackoverflow.com/a/1375429/6299857
Pas directement. C'est probablement une mauvaise pratique de faire dépendre le comportement de A de la classe qui l'utilise - la prochaine fois que vous voudrez utiliser A d'une classe totalement différente, vous aurez une surprise. Il est préférable de transmettre toutes les entrées via des paramètres au constructeur, afin que le fonctionnement de A soit évident et qu'il puisse être facilement utilisé par d'autres classes (réutilisabilité!).