如何使用反射在.NET中获取对象名称?

4
在 .net 中,我该如何获取声明类型中对象的名称。例如...
public static void Main()
{
Information dataInformation =  new Information();
}

public class Inforamtion
{

//Constructor
public Inforamtion()
{

//Can I fetch name of object i.e. "dataInformation" declared in Main function
//I want to set the object's Name property = dataInformation here, because it is the name used in declaring that object.
}

public string Name = {get; set;}
}

顺便说一句,我想说的是,试图强制将变量名与任何运行时值之间建立某种映射关系是一场可维护性灾难。 - JoshJordan
1
记住你看到的是一个文本文件,一旦编译,你的变量名只会被替换成标签。当 Jitter 接手后,变量名最终会变成指针。你的变量名的文本值在源文件和调试符号之外不会被保留。 - Josh
你为什么想要这样做呢?能否请你解释一下? - this. __curious_geek
3个回答

4
就CLR而言,实际上没有一种方法能够确定对象的名称。这种信息在调试信息和程序集中存储(在某种程度上),但在运行时不使用。无论如何,你所指的对象只是内存中的一堆字节。它可能有多个引用和多个名称,因此即使你可以获取所有引用该对象的变量的名称,也无法以编程方式确定要使用哪一个。
简而言之:你无法做到这一点。

1
这就是为什么每个程序员都应该学习一些汇编语言,或者至少C语言。 - Josh
Python也是一种脚本语言,与.NET Framework完全不同。 - Adam Maras
1
@软件Python和CLR一样,都不允许这样做。在Python中,变量是在“作用域”对象中创建的,在CLR的情况下,实例成员可以通过反射查看(如果它们是局部变量,则情况将有所不同)。 然而,这并没有解决根本问题:变量不是对象,仅仅是存储/引用对象的一种方式。因此,使用Python和/或CLR将需要手动搜索一个对象通过一组变量的集合 - user166390

3
那是变量名称,不是对象名称。这也引出了一个问题:这里的名称是什么?
Information foo, bar;
foo = bar = new Information(); 

对于构造函数等,您无法这样做;在有限的情况下,如果您真的想要,可以通过Expression获取变量名称:

    public static void Main()
    {
        Information dataInformation =  new Information();
        Write(() => dataInformation);
    }
    static void Write<T>(Expression<Func<T>> expression)
    {
        MemberExpression me = expression.Body as MemberExpression;
        if (me == null) throw new NotSupportedException();
        Console.WriteLine(me.Member.Name);
    }

请注意,这取决于捕获实现等内容-通常有点无礼。

非常感谢你,马克。虽然目前的方案不可行,但是它启发了我另外一种设计思路...非常感谢。 - Software Enthusiastic

1

我认为这是不可能的。

但首先,你为什么需要这样的东西?

通过我的经验,我意识到如果你需要编译器或语言中没有提供的奇怪功能,那么(很多时候)这意味着方法或逻辑存在问题。

请重新考虑你为什么要尝试实现这个。


简而言之,我们需要这个功能,因为我们正在设计一个框架,计划简化许多事情。无论如何,感谢您的评论... - Software Enthusiastic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接