也许,这个问题很愚蠢,但在我的具体情况下,我想得到实例名称,所以我的意思是:
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'
答案 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());
我真的很想知道这会打印出来。