使用反射从父类获取自己的属性名称
本文关键字:自己的 属性 获取 父类 反射 | 更新日期: 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__);
}
}
我想Log
从Parent1
调用Method
时myName
的值,以及如果从Parent2
调用Method
mySecondName
的值。
是否可以使用反射而不是通过在参数中通过字符串传递名称(我只想将其用于调试目的,我不想以任何方式将这些类链接在一起)
使用该StackTrace
,您至少可以获取进行调用的方法和类:
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace();
Type calledFromType = trace.GetFrame(1).GetMethod().ReflectedType;
这应该为您提供Parent1
类型。
我认为没有办法获取调用该方法的变量的名称。
当然,您可以枚举calledFromType
的所有字段和属性,并查看其中一个是否属于Child
类型,但无法保证在调用时实际使用了字段或属性。
由于各种原因,没有现实的方法可以使用反射来做到这一点:
-
实例的状态中没有任何内容与特定的"所有者"相关。
-
可以从有权访问该属性的任何位置调用代码,因此堆栈跟踪不会可靠地返回任何有用的内容。
-
对类实例的引用可以存储在任意数量的位置,包括方法调用的变量和参数。
所以基本上,没有。 你能做的最好的事情就是告诉它它在哪里,即使这样,你也会犯参考副本的麻烦。
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);
}
}