[英]Get own property name from parent class using 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
值myName
时, Method
是从所谓的Parent1
和mySecondName
如果Method
是从所谓的Parent2
。
是否可以使用反射而不是通过参数中的字符串传递名称(我只想将其用于调试目的,我不想以任何方式将这些类链接在一起)
使用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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.