如何知道调用类名

本文关键字:调用 何知道 | 更新日期: 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();