获取实例名称c#

时间:2013-05-03 16:37:56

标签: c#

也许,这个问题很愚蠢,但在我的具体情况下,我想得到实例名称,所以我的意思是:

class Student
{
     private string name {get; private set;}

     public Student(string name) 
     {
         this.name = name 
     }

     public getInstanceName() 
     {
        //some function
     }

}

所以我生一个学生

   Student myStudent = new Student("John");

这很愚蠢,但我想要这个

 myStudent.getInstanceName(); // it should return 'myStudent'

8 个答案:

答案 0 :(得分:16)

现在可以在C#6.0中使用:

Student myStudent = new Student("John");
var name = nameof(myStudent); // Returns "myStudent"

这对代码约定和错误记录非常有用,因为这意味着如果在错误消息中使用“myStudent”并稍后决定重命名“myStudent”,编译器将强制您将消息中的名称更改为好吧,而不是忘记它。

答案 1 :(得分:8)

这在C#中是不可能的。在运行时,变量名称甚至不存在,因为JIT删除了符号信息。

此外,变量是对类实例的引用 - 多个变量可以引用同一个实例,并且实例可以在其生命周期内由不同名称的变量引用。

答案 2 :(得分:5)

这个问题非常陈旧,但答案随着.Net Framework 4.6的发布而改变。现在有一个nameof(..)运算符,可用于在编译时获取变量名称的字符串值。

因此对于原始问题C# nameof(myStudent) // returns "myStudent"

答案 3 :(得分:4)

试一试

string result = Check(() => myStudent);

static string Check<T>(Expression<Func<T>> expr)
{
    var body = ((MemberExpression)expr.Body);
    return body.Member.Name;
}

或者

GetName(new { myStudent });

static string GetName<T>(T item) where T : class 
{
  return typeof(T).GetProperties()[0].Name;
}

答案 4 :(得分:1)

变量名称仅用于编码时的好处。编译代码后,名称myStudent不再存在。您可以在字典中跟踪实例名称,如下所示:

var students = new Dictionary<string, Student>();
var students["myStudent"] = new Student("John");

// Find key of first student named John
var key = students.First(x => x.Value.Name == "John").Key; // "myStudent"

答案 5 :(得分:1)

不,但你可以这样做

var myStudent = new Student("John").Named("myStudent");
var nameOfInstance = myStudent.Name();

public static class ObjectExtensions
{
    private static Dictionary<object,string> namedInstances = new Dictionary<object, string>(); 

    public static T Named<T>(this T obj, string named)
    {
        if (namedInstances.ContainsKey(obj)) namedInstances[obj] = named;
        else namedInstances.Add(obj, named);
        return obj;
    }

    public static string Name<T>(this T obj)
    {
        if (namedInstances.ContainsKey(obj)) return namedInstances[obj];
        return obj.GetType().Name;
    }
}

答案 6 :(得分:1)

所以我一直在寻找一个星期左右,试图弄清楚如何做到这一点。在收集点点滴滴的东西时,我不知道我找到了一个相对简单的解决方案。

我认为原始发帖人正在寻找这样的东西,因为如果您必须使用班级的名称来找出班级的名称,那有什么意义。

对于那些说“不可能”和“为什么要...”的人,我的特殊原因是使用一个类库,其中有一个类,应用程序开发人员可以根据需要调用实例,而这意味着有多个名称不同的实例。因此,我需要一种能够识别这些实例的方法,以便在这种情况下使用正确的实例。

    public static List<Packet> Packets = new List<Packet>();
    public class Packet
    {
        public Packet(string Name)
        {
            Packets.Add(this);
            name = Name;
        }
        internal string _name;
        public string name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

它确实需要它们传入实例的名称,因为我尚未弄清楚如何从构造函数内部获取它们使用的名称。 不可能

    public Packet MyPacket = new Packet("MyPacket");

这将创建实例,将其引用存储在Packets中,并将其名称保存在新创建的实例中。

要获取与数据包关联的名称,并将其连接到变量。

    Packet NewName = Packets[Packets.FindIndex(x => x.name == "MyPacket");

使用相同的变量名还是新的变量名并不重要,它只是将所需的实例链接到它。

    Console.WriteLine(NewName.name); // Prints MyPacket

对于具有相同名称的实例,您将不得不想出其他方法来区分它们,这将需要另一个列表和一些逻辑来确定您想要哪个。

答案 7 :(得分:-1)

不,这是不可能的,因为这完全是荒谬的。对象永远不会以任何方式知道您将其分配给的变量的名称。想象:

Student myStudent = new Student("John");
Student anotherStudent = myStudent;
Console.Write(anotherStudent.getInstanceName());

应该说myStudent还是anotherStudent?显然,它没有任何线索。或者更有趣的情况:

School mySchool = new School("Harvard");
mySchool.enroll(new Student("John"));
Console.Write(mySchool.students[0].getInstanceName());

我真的很想知道这会打印出来。