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

本文关键字:自己的 属性 获取 父类 反射 | 更新日期: 2023-09-27 18:32:48

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

假设我有三个类:

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

我想LogParent1调用MethodmyName的值,以及如果从Parent2调用Method mySecondName的值。

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

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

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

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

这应该为您提供Parent1类型。

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

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

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

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

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

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

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

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