如何知道调用类名
本文关键字:调用 何知道 | 更新日期: 2023-09-27 18:00:32
有没有办法知道哪个类调用了另一个类中的函数。例如:
public class A
{
public static string Aa = "test";
public void test()
{
B.testB();
}
}
public class B
{
public static void testB()
{
string Bb = A.Aa;
}
}
在上面的例子中,我知道A类函数已经调用了B类中的函数。但是,如果有很多类将调用B类中函数,并且所有这些类都有共同的变量Aa,那么我如何读取它的值并将其分配给Bb
string Bb = CalledClassName.Aa;
您可以使用随添加的CallerMemberNameAttribute
。净4.5。这只会让你得到会员名称:
public void SomeMethod ()
{
OtherMethod();
}
public void OtherMethod ([CallerMemberName] string memberName = null)
{
Console.WriteLine(memberName);
}
该属性将在编译时填充可选参数,因此它实际上将调用OtherMethod("SomeMethod")
。
还可以组合使用访问堆栈跟踪和使用反射来读取调用方法类型的Aa
属性。请注意,这会访问调试信息,并且很容易受到代码更改的影响。它的性能也很差,所以您应该避免它。但只是为了向你展示如何使用它:
public static void testB()
{
StackTrace stackTrace = new StackTrace();
Type callingType = stackTrace.GetFrame(1).GetMethod().DeclaringType;
FieldInfo field = callingType.GetField("Aa", BindingFlags.Public | BindingFlags.Static);
string Bb = (string) field.GetValue(null);
Console.WriteLine(Bb);
}
使用接口,传入:
public interface AaInterface {
public string GetAa();
}
public class A : AaInterface
{
public static string Aa = "test";
public GetAa() { return Aa; }
public void test()
{
B.testB(this);
}
}
public class B
{
public static void testB(AaInterface pAa)
{
string Bb = pAa.GetAa();
}
}
我想你在寻找与你所要求的不同的东西。
您应该将A
的实例传递给您的方法。所有调用方法都应该基于接口传递实例。在该界面中,您放置了要共享的属性和方法。通过这种方式,您可以为每个传递的实例调用"same"方法。
public interface ISomeInterface
{
string Aa {get;}
}
public class A : ISomeInterface
{
public string Aa {get { return "a"; } }
}
然后你可以把它传递给这个方法:
public static void testB(ISomeInterface something)
{
string Bb = something.Aa;
}
请注意,在这种情况下,Aa
不允许是static
。不过,您可以将该静态封装在实例属性中
如果我正确理解您的问题,那么您可以将对方法中类实例的引用作为参数传递,然后使用"is"运算符检查其类型:
public class A
{
public static string Aa = "test";
public void test(object calledClass)
{
if(calledClass is B) Aa = calledClass.Bb;
}
}
当您从类B调用这个静态方法时,只需输入:
A.Test(this)
第页。S这只是一个逻辑示例,您可以使用它来实现您想要的
我认为你可以这样做:
public class A {
public void test() {
B.testB(this);
}
}
public class B {
public static void testB(object sender) {
String className = sender.GetType().Name;
}
}
//To call
A a = new A();
a.test();