14

たぶん、この質問はばかげていますが、私の特定の状況ではインスタンス名を取得したいので、私が意味すること:

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'
4

8 に答える 8

10

これは C# では不可能です。実行時には、JIT がシンボル情報を削除するため、変数名は存在しません。

さらに、変数はクラス インスタンスへの参照です。複数の変数が同じインスタンスを参照できます。また、インスタンスは、その有効期間を通じて異なる名前の変数によって参照できます。

于 2013-05-03T16:40:46.000 に答える
5

この質問は非常に古いものですが、.Net Framework 4.6 のリリースで答えが変わりました。nameof(..)コンパイル時に変数名の文字列値を取得するために使用できる演算子が追加されました。

したがって、元の質問についてはC# nameof(myStudent) // returns "myStudent"

于 2016-09-20T22:45:35.217 に答える
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;
}
于 2013-05-03T16:41:15.110 に答える
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;
    }
}
于 2014-02-17T14:04:01.800 に答える
-2

いいえ、まったくばかげているので、これは不可能です。オブジェクトは、たまたま割り当てられた変数の名前を決して知ることはできません。想像:

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

またはと言うべきですmyStudentanotherStudent?明らかに、手がかりはありません。または面白い状況:

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

これが何を印刷するのか本当に知りたいです。

于 2013-05-03T16:41:12.240 に答える