使用反射从父类获取自己的属性名称

时间:2013-09-26 08:06:08

标签: c# reflection

是否可以在调用它的类中获取当前类所赋予的属性名称?

假设我有三节课:

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

如果调用Log,则myNameMethodParent1调用mySecondNameMethod Parent2来自{{1}}。

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

3 个答案:

答案 0 :(得分:3)

使用StackTrace,你至少可以获得进行调用的方法和类:

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

这应该为您提供Parent1类型。

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

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

答案 1 :(得分:3)

由于各种原因,使用反射没有现实的方法:

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

  2. 您可以从有权访问该属性的任何地方调用您的代码,因此堆栈跟踪无法可靠地返回任何有用的内容。

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

  4. 所以基本上没有。你能做的最好的事情是告诉它在哪里,即便如此你也会违反参考副本。

答案 2 :(得分: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);
        }
    }