4

是否可以在调用它的类中获取当前类分配给的属性的名称?

假设我有三个课程:

class Parent1
{
   public Child myName;

   public void Foo()
   {
      myName.Method();
   }
}

class Parent2
{
   public Child mySecondName;

   public void Foo()
   {
      mySecondName.Method();
   }
}

class Child
{
   public void Method()
   {
      Log(__propertyName__);
   }
}

我想要调用 from以及调用from时的Log值。myNameMethodParent1mySecondNameMethodParent2

是否可以使用反射而不是通过参数中的字符串传递名称(我只想将其用于调试目的,我不想以任何方式将这些类链接在一起)

4

3 回答 3

3

使用StackTrace您至少可以获取进行调用的方法和类:

System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace();
Type calledFromType = trace.GetFrame(1).GetMethod().ReflectedType;

这应该给你Parent1类型。

我认为没有办法获取调用该方法的变量的名称。

您当然可以枚举 的所有字段和属性calledFromType并查看其中一个是否属于该Child类型,但您无法保证在调用时实际使用了字段或属性。

于 2013-09-26T08:18:12.693 回答
3

由于多种原因,使用反射没有现实的方法来做到这一点:

  1. 您的实例状态中没有与特定“所有者”相关的任何内容。

  2. 可以从可以访问该属性的任何地方调用您的代码,因此堆栈跟踪不会可靠地返回任何有用的东西。

  3. 对您的类的实例的引用可以存储在任意数量的位置,包括方法调用的变量和参数。

所以基本上,没有。你能做的最好的就是告诉它它在哪里,即使这样你也会犯规参考副本。

于 2013-09-26T08:27:47.220 回答
2
class Child
    {
        public void Method()
        {
            StackFrame sf = new StackFrame(1);
            var type = sf.GetMethod().ReflectedType;

            var field = type.GetFields().FirstOrDefault(i => i.FieldType == typeof(Child));

            Log(field.Name);
        }
    }
于 2013-09-26T08:29:04.510 回答