【问题标题】:How to fetch object name using reflection in .net?如何在.net中使用反射获取对象名称?
【发布时间】:2009-10-31 04:54:19
【问题描述】:

在 .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;}
}

【问题讨论】:

  • 顺便说一句,我想说的是,试图在变量名和任何运行时值之间强制进行一些映射是可维护性的灾难。
  • 请记住,您正在查看的是一个文本文件,并且您的变量名在编译后将简单地替换为某个标签。一旦 Jitter 获得变量名,变量名最终将成为一个指针。变量名称的文本值不会保留在源文件和调试符号之外。
  • 你到底为什么要这么做?你能解释一下吗?

标签: c# .net vb.net reflection


【解决方案1】:

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

长话短说:你不能那样做。

【讨论】:

  • 这就是为什么每个程序员都应该使用一些汇编语言,或者至少是 C
  • Python 也是一种脚本语言,其构建方式完全不同于 .NET Framework。
  • @Software Python 不比 CLR 更允许这样做。在 Python 的情况下,变量是在“范围”对象中创建的,在 CLR 的情况下,可以通过反射查看实例成员(如果它们是本地人,那么这个故事会有所不同)。 然而,这并没有解决根本问题:变量不是对象,只是存储/引用对象的一种方式。因此,使用 Python 和/或 CLR 将需要手动搜索对象通过变量集合
【解决方案2】:

那是变量的名字,不是对象的名字。它也提出了一个问题:这里叫什么名字:

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);
    }

请注意,这依赖于捕获实现等 - 通常是厚颜无耻的。

【讨论】:

  • 非常感谢 Marc,认为目前的方法不是答案,它引导我设计了另一种方法......非常感谢。
【解决方案3】:

我认为这是不可能的。

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

根据我的经验,我意识到,如果您需要编译器或未提供的语言提供一些奇怪的东西,那么(通常)这意味着方法或逻辑有问题。

请重新考虑你为什么要达到这个目的。

【讨论】:

  • 简而言之,这个功能是必需的,因为我们正在设计一个框架,我们计划在其中简化很多事情。无论如何感谢您的 cmets...
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多