有没有办法知道哪个类在另一个类中调用了一个函数。 例如:
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;
答案 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();