获取在C#中调用方法的实例

时间:2010-02-10 14:15:26

标签: c# class methods instance

我正在寻找一种算法,可以在该方法中获取调用该方法的对象。

例如:

public class Class1 {

    public void Method () {
        //the question
        object a = ...;//the object that called the method (in this case object1)
        //other instructions
    }

}

public class Class2 {

    public Class2 () {
        Class1 myClass1 = new Class1();
        myClass1.Method();
    }

    public static void Main () {
        Class2 object1 = new Class2();
        //...
    }

}

有没有办法做到这一点?

5 个答案:

答案 0 :(得分:9)

以下是如何执行此操作的示例...

...
using System.Diagnostics;
...

public class MyClass
{
/*...*/
    //default level of two, will be 2 levels up from the GetCaller function.
    private static string GetCaller(int level = 2)
    {
        var m = new StackTrace().GetFrame(level).GetMethod();

        // .Name is the name only, .FullName includes the namespace
        var className = m.DeclaringType.FullName;

        //the method/function name you are looking for.
        var methodName = m.Name;

        //returns a composite of the namespace, class and method name.
        return className + "->" + methodName;
    }

    public void DoSomething() {
        //get the name of the class/method that called me.
        var whoCalledMe = GetCaller();
        //...
    }
/*...*/
}

发布此信息,因为我花了一段时间才找到自己正在寻找的东西。我在一些静态记录器方法中使用它......

答案 1 :(得分:1)

你可以在代码中找到当前的堆栈跟踪并向上走一步。 http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

但正如下面评论的那样,这将为您提供调用您的方法和类,但不是实例(如果有实例,当然可能是静态的)。

答案 2 :(得分:-1)

因为

,它将是非常糟糕的风格

a)会打破封装 b)在编译时无法知道调用对象的类型,因此无论您以后如何处理该对象,它都可能无法正常工作。
c)如果你只是将对象传递给构造函数或方法会更容易/更好,例如:

Class1 c1 = new Class1(object1);

答案 3 :(得分:-3)

或者只是将对象作为方法参数传递。

public void Method(object callerObject)
{
..
}

并调用方法:

myClass.Method(this);

问候,弗洛里安

答案 4 :(得分:-4)

显然我不知道你的情况的具体细节,但这似乎你需要重新考虑一下你的结构。

如果构造了适当的继承,这很容易做到。

考虑查看从所述抽象类继承的抽象类和类。你甚至可以用接口完成同样的事情。