获取引用C#中对象的变量名称

时间:2010-09-08 08:39:23

标签: c#

是否有可能获得用于在C#中调用对象的变量名称?或者是否可以获得引用特定对象的所有变量?

编辑: 只是为了进一步澄清,即使已经回答了这个问题。

考虑FredrikMörk提供的代码示例

User someUser = new User(); 
User anotherVariable = someUser; 

i。是否可以使用anotherVariable引用的对象找到someUser II。是否有可能找到用于调用对象的变量的名称。这就像someUser.getName()应该将“someUser”作为输出。

3 个答案:

答案 0 :(得分:2)

不,没有对此的支持。当然,如果你有一组“候选”变量(例如“找到这种类型的所有实例变量,这里是一堆该类型的对象”),那么你可以检查它们中的任何一个当前是否引用了一个特定的值。但除此之外,没有。

答案 1 :(得分:2)

我不确定我理解你的问题,但我这样解释:

User someUser = new User();
User anotherVariable = someUser;

现在,您希望使用someUser引用的对象(最初分配给anotherVariable的用户对象)查找someUser。如果这是问题,答案是否定的,那是不可能的(AFAIK)。

答案 2 :(得分:1)

您可以通过使用反射来遍历对象层次结构并查找引用您正在查找的对象的字段。这是我用来完成这个的功能。您必须为其搜索提供根对象。

如果你可以查看根堆栈框架并在那里遍历局部变量,这可能会有所改进,但就我的目的而言,应用程序通常知道它所关心的最基本对象。

// Spew all references to obj throughout the object hierarchy.
public static void FindReferences( object appRootObject, object obj )
{
    Stack<ReferencePath> stack = new Stack<ReferencePath>();
    FindReferences_R( stack, appRootObject, obj );
}

struct ReferencePath
{
    public ReferencePath( object parentObj, FieldInfo parentField )
    {
        m_ParentObject = parentObj;
        m_ParentField = parentField;
    }

    public object m_ParentObject;
    public FieldInfo m_ParentField;
}

static void PrintReferencePath( Stack< ReferencePath > stack )
{
    string s = "RootObject";
    foreach ( ReferencePath path in stack.ToArray().Reverse() )
    {
        s += "." + path.m_ParentField.Name;
    }
    System.Console.WriteLine( s );
}

static bool StackContainsParent( Stack< ReferencePath > stack, object obj )
{
    foreach ( ReferencePath path in stack )
    {
        if ( path.m_ParentObject == obj )
            return true;
    }

    return false;
}

static void FindReferences_R( Stack< ReferencePath > stack, object curParent, object obj )
{
    Type parentType = curParent.GetType();

    foreach ( MemberInfo memberInfo in parentType.GetMembers( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ) )
    {
        FieldInfo fieldInfo = memberInfo as FieldInfo;
        if ( fieldInfo == null )
            continue;

        Type fieldType = fieldInfo.FieldType;
        if ( !fieldType.IsClass )
            continue;

        object value = fieldInfo.GetValue( curParent );
        if ( value == null )
            continue;

        stack.Push( new ReferencePath( curParent, fieldInfo ) );
        if ( value == obj )
        {
            PrintReferencePath( stack );
        }

        // Recurse, but don't recurse forever.
        if ( !StackContainsParent( stack, value ) )
        {
            FindReferences_R( stack, value, obj );
        }

        stack.Pop();
    }
}