2013-05-03 15 views
10

हो सकता है, इस सवाल का बेवकूफ है, लेकिन मेरे विशिष्ट स्थिति में मैं उदाहरण के नाम प्राप्त करना चाहते हैं, मैं तो क्या मतलब है:उदाहरण के नाम जाओ 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' 
+1

तो के लिए आप वैरिएबल का नाम करना चाहते हैं? –

+3

आप इसके लिए क्या चाहते हैं? इसका कोई मतलब नही बनता। –

+0

क्या आप वैरिएबल e..g 'myStudent' का नाम चाहते हैं, या छात्र का नाम उदा। 'John'? – eandersson

उत्तर

9

यह सी # में संभव नहीं है। रनटाइम पर, वेरिएबल नाम भी मौजूद नहीं होंगे, क्योंकि जेआईटी प्रतीक जानकारी को हटा देता है।

इसके अलावा, चर वर्ग वर्ग का संदर्भ है - एकाधिक चर एक ही उदाहरण का संदर्भ दे सकते हैं, और एक उदाहरण को पूरे जीवनकाल में अलग-अलग नामों के चर द्वारा संदर्भित किया जा सकता है।

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

मैं वास्तव में पता करने के लिए इस प्रिंट आउट क्या चाहते हैं।

+2

यह हास्यास्पद नहीं है। इन समस्याओं को सभी को सुलझाने के द्वारा सुलझाया जा सकता है कि लौटाया गया मान ऑब्जेक्ट को कम करने और विधि को कॉल करने के लिए उपयोग किए जाने वाले चर या पहचानकर्ता का नाम होना चाहिए। कॉलिंग कोड की लाइन संख्या, कॉलिंग विधि का नाम आदि प्राप्त करना पहले से ही संभव है। मुझे सराहना है कि सीएलआर के तहत यह संभव नहीं है क्योंकि प्रतीकों को @ रीड कॉपसी राज्यों के रूप में प्रबंधित किया जाता है, लेकिन यह शायद ही हास्यास्पद है। मैं आपके प्रश्न का उत्तर दे सकता हूं: "छात्र [0]"! –

3

इस एक कोशिश

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; 
} 
+2

मेरे द्वारा +1 - यह एक दिलचस्प दृष्टिकोण है। ध्यान दें कि यह वास्तव में परिवर्तनीय नाम नहीं प्राप्त कर रहा है, जितना अधिक एक चर या एक क्षेत्र में मिलान करने के लिए एक चर के साथ एक नया प्रकार बनाना, और उसे लाने। ज्यादातर मामलों में काम करता है (आप इसे तोड़ सकते हैं, लेकिन सामान्य रूप से, एक दिलचस्प दृष्टिकोण)। –

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" 
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; 
    } 
} 
13

कर सकता है इस में सी # 6.0 अब संभव है:

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

यह कोड अनुबंध और त्रुटि लॉगिंग के लिए उपयोगी है क्योंकि इसका मतलब है कि यदि आप अपने त्रुटि संदेश में "myStudent" का उपयोग करते हैं और बाद में "myStudent" का नाम बदलने का निर्णय लेते हैं, तो आप को कंपाइलर द्वारा एम में नाम बदलने के लिए मजबूर किया जाएगा संभवतः इसे भूलने के बजाय सार भी।

+1

एफवाईआई सी # 6.0! = .नेट 4.6, तो 'अब यह सी # 6.0' के साथ संभव है। सी # का संस्करण आप उपयोग कर रहे हैं संकलक समर्थन => आईडीई पर आधारित है। सी # 6.0 में लिखने के लिए आपको विजुअल स्टूडियो 2015 की आवश्यकता है। – Athafoud

+0

@Athafoud सुधार के लिए धन्यवाद :) – elexis

4

यह प्रश्न बहुत पुराना है, लेकिन उत्तर नेट फ्रेमवर्क 4.6 के रिलीज के साथ बदल गया। अब nameof(..) ऑपरेटर है जिसका उपयोग संकलन समय पर चर के नाम का स्ट्रिंग मान प्राप्त करने के लिए किया जा सकता है।

तो मूल प्रश्न C# nameof(myStudent) // returns "myStudent"

संबंधित मुद्दे