是否可以在调用它的类中获取当前类所赋予的属性名称?
假设我有三节课:
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
来自{{1}}。
是否可以使用反射而不是通过参数中的字符串传递名称(我只想将其用于调试目的,我不想以任何方式将这些类链接在一起)
答案 0 :(得分:3)
使用StackTrace
,你至少可以获得进行调用的方法和类:
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace();
Type calledFromType = trace.GetFrame(1).GetMethod().ReflectedType;
这应该为您提供Parent1
类型。
我认为没有办法获取调用该方法的变量的名称。
您当然可以枚举calledFromType
的所有字段和属性,并查看其中一个是Child
类型,但是您无法保证在实际使用字段或属性时调用
答案 1 :(得分:3)
由于各种原因,使用反射没有现实的方法:
您的实例状态中没有任何内容与特定的“所有者”相关。
您可以从有权访问该属性的任何地方调用您的代码,因此堆栈跟踪无法可靠地返回任何有用的内容。
对您的类实例的引用可以存储在任意数量的位置,包括方法调用的变量和参数。
所以基本上没有。你能做的最好的事情是告诉它在哪里,即便如此你也会违反参考副本。
答案 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);
}
}