如何使用.net中的反射获取对象名称?

时间:2009-10-31 04:54:19

标签: c# .net vb.net reflection

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

3 个答案:

答案 0 :(得分:4)

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

长话短说:你做不到。

答案 1 :(得分: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);
    }

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

答案 2 :(得分:1)

我认为这不可能。

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

根据我的经验,我已经意识到,如果你需要一些奇怪的编译器或一种没有提供的语言,那么(大多数情况下)它意味着这种方法或逻辑有问题。

请重新考虑为什么要尝试实现这一目标。