如何知道调用类名?

时间:2015-07-01 06:32:12

标签: c#

有没有办法知道哪个类在另一个类中调用了一个函数。 例如:

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;

5 个答案:

答案 0 :(得分:6)

您可以使用随.NET 4.5添加的https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/GuardClause。这只会获得会员名称:

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); } 属性的组合。请注意,这会访问调试信息,并且很容易受到代码更改的影响。它也有糟糕的表现,所以你应该避免它。但只是告诉你如何使用它:

{{1}}

答案 1 :(得分:5)

使用界面,将其传递给:

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

答案 2 :(得分:2)

我猜你正在寻找与你要求的不同的东西。

您应该将A的实例传递给您的方法。所有调用方法都应该基于接口传递实例。在该界面中,您可以放置​​要共享的属性和方法。通过这种方式,您可以为每个传递的实例调用“相同”方法。

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。您可以将静态包装在实例属性中。

答案 3 :(得分:0)

如果我正确理解了你的问题,那么你可以在方法中作为参数传递对类实例的引用,然后使用'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)

P.S。 这只是您可以用来实现您想要的逻辑的一个例子

答案 4 :(得分:0)

我想你可以做这样的事情:

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