সি # তার নিজস্ব শ্রেণীর নাম পাচ্ছে


464

আমার যদি একটি ক্লাস বলা হয় MyProgram, তবে " মাইপ্রগ্রাম " কে স্ট্রিং হিসাবে পুনরুদ্ধার করার কোনও উপায় আছে ?

উত্তর:


743

এটা চেষ্টা কর:

this.GetType().Name

36
আপনি যদি কোনও স্ট্যাটিক পদ্ধতিতে থাকেন তবে বিকাশকারী জানেন যে প্রকারটির নাম কী। আপনি এটি উত্স কোডের একটি স্ট্রিং হিসাবে টাইপ করতে পারেন।
এরিক লিপার্ট

122
@ এরিকলিপার্ট: আপনি যদি নামটি টাইপ করেন তবে ক্লাসটির নতুন নামকরণ করা থাকলে সংকলক এটি ধরবে না।
হলভার্ড

12
@ হালওয়ার্ড: প্রথমত, যদি স্থির পদ্ধতিটি বর্তমান ধরণের হয় তবে নামটি alচ্ছিক; যদি আপনি এটি পরিবর্তনের বিষয়ে উদ্বিগ্ন হন তবে এটি বাদ দিন। দ্বিতীয়ত, ভিজুয়াল স্টুডিও স্বয়ংক্রিয়ভাবে আপনাকে একটি স্মার্ট ট্যাগ দেবে যখন আপনি কোনও শ্রেণীর নাম পরিবর্তন করে যা এর সমস্ত দৃষ্টান্তের নাম পরিবর্তন করে। এবং তৃতীয়ত, আপনি যদি একটি শ্রেণীর নাম পরিবর্তন করে থাকেন তবে প্রতিক্রিয়াগুলি ভাল তবে আপনাকে ইতিমধ্যে অনেক জায়গায় অনেক পরিবর্তন করতে হবে।
এরিক লিপার্ট

12
@ ইরিকলিপার্ট আপনি ঠিক বলেছেন ভিজ্যুয়াল স্টুডিও বা রিশার্পারের যে কোনও নতুন সংস্করণ ক্লাসটির নাম পরিবর্তন করার সাথে সাথে একই নামের সাথে স্ট্রিংগুলি ধরবে। আমার পূর্ববর্তী মন্তব্যটি কেবলমাত্র কিছু পুরানো, এখন অকেজো জ্ঞান ...
হলভার্ড

17
@ হালওয়ার্ড: ... এবং সি # 6 এ আপনি নতুন nameofঅপারেটরটি ব্যবহার করতে পারেন ।
এরিক লিপার্ট

238

আমি ভাল পরিমাপের জন্য এটি ফেলে দিতে চেয়েছিলাম। আমি মনে করি @ এমাহাহাতান যেভাবে পোস্ট করেছেন তা পছন্দসই।

typeof(MyProgram).Name

24
এটি আসলে আরও ভাল, কারণ: ১. এটি স্থির প্রসঙ্গে কাজ করবে ২. এটি সময় গণনা করা হয়, তাই প্রতিফলনের মতো এটির জন্য ব্যয় হয় না
গিলবার্ট

6
@ জিমবাল্টার এর একাধিক সুবিধা রয়েছে: ১. স্থির প্রসঙ্গ। ২. টাইপ অংশটি প্রতিবার সিএলআর দ্বারা পুনরায় মূল্যায়ন করা হবে না - এটি এমএসআইএলকে লেখা হবে। ৩. এটি আপনাকে নতুন "গেটটাইপ ()" ঘোষণার হাত থেকে সুরক্ষা দেয়।
গিলবার্ট

11
আপনি যদি উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণীর নাম পেতে চান এবং এই কলটি পিতামাতার মধ্যে থাকে তবে এটি কার্যকর হবে না।
G61

10
স্পষ্টভাবে প্রকারটি উল্লেখ করার অসুবিধা রয়েছে যা এটি কম সহজেই পুনরায় ব্যবহারযোগ্য করে তোলে।
সিআরসি ক্র্যাক

20
সি # 6.0 বা তার পরে আপনি করতে পারেন nameof(MyProgram)
ওভেন জনসন

190

সি # 6.0 এর সাহায্যে আপনি nameofঅপারেটরটি ব্যবহার করতে পারেন :

nameof(MyProgram)

4
দুর্দান্ত জিনিস; প্রকার সদস্যের সাথেও কাজ করে (যেমন পদ্ধতি এবং বৈশিষ্ট্যগুলি) এবং এমনকি ভেরিয়েবল - ডক্স দেখুন
mklement0

127

যদিও মাইকেলাহনের উত্তর ভাল, এটি কোনও স্থির পদ্ধতিতে কাজ করবে না। আপনি যদি বর্তমান ধরণের নামটি পুনরুদ্ধার করতে চান তবে এটিকে সর্বত্র কাজ করা উচিত:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;

2
ভাল ধরা, যদিও আমি মনে করি এই ক্ষেত্রে আমার পদ্ধতি পছন্দ করা হয়।
কেওসপ্যান্ডিয়ন 21'10

5
এটি অ-ভার্চুয়াল পদ্ধতির জন্য কাজ করবে না, কারণ এটি যে ধরণের পদ্ধতিতে ঘোষিত এবং প্রয়োগ করা হয়েছে তার নামটি ফিরে আসবে, (সম্ভবত উত্তরাধিকার শৃঙ্খলা তৈরি করবে), আপনি যে কোডটি প্রকৃতপক্ষে কার্যকর করছেন তার দৃ the় প্রকার নয় concrete থেকে।
চার্লস ব্রেটানা

1
এটি ডিএনএক্স (ডট নেট এক্সিকিউশন) কাঠামোতে আর কাজ করবে বলে মনে হচ্ছে না। তারা getCurrentMethod () পদ্ধতিটি সরিয়ে ফেলেছে এবং কেবলমাত্র getMethodFromHandle () রেখে গেছে।
আস্তার

বংশধরদের ভার্চুয়াল ফাংশন থেকে কলড কংক্রিট বর্গের নাম নির্বাহের কোডটি পেতে আমার ঠিক এটিই প্রয়োজন ছিল।
ডাঃফ্লয়েড 5

15

রেফারেন্সের জন্য, যদি আপনার কাছে এমন কোনও প্রকার থাকে যা অন্যের কাছ থেকে উত্তরাধিকার সূত্রে আসে আপনিও এটি ব্যবহার করতে পারেন

this.GetType().BaseType.Name

12

আপনার যদি উদ্ভূত শ্রেণিতে এটির প্রয়োজন হয় তবে আপনি কোডটি বেস শ্রেণিতে রাখতে পারেন:

protected string GetThisClassName() { return this.GetType().Name; }

তারপরে, আপনি উত্পন্ন ক্লাসে নামটি পৌঁছাতে পারবেন। প্রাপ্ত ক্লাসের নাম ফেরত দেয়। অবশ্যই, নতুন কীওয়ার্ড "নেমফ" ব্যবহার করার সময়, এই বিভিন্ন কাজের মতো কোনও প্রয়োজন হবে না।

এছাড়াও আপনি এটি সংজ্ঞায়িত করতে পারেন:

public static class Extension
{
    public static string NameOf(this object o)
    {
        return o.GetType().Name;
    }
}

এবং তারপরে এটি ব্যবহার করুন:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}

10

এটা ব্যবহার কর

যাক যাক অ্যাপ্লিকেশন টেস্ট.এক্সি চলছে এবং ফাংশনটি ফু () এটি ফর্ম 1 এ [মূলত এটি শ্রেণি ফর্ম 1 ], তারপরে উপরের কোডটি নীচে প্রতিক্রিয়া তৈরি করবে।

string s1 = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

এই ফিরে আসবে।

s1 = "TEST.form1"

ফাংশন নামের জন্য:

string s1 = System.Reflection.MethodBase.GetCurrentMethod().Name;

ফিরে আসবে

s1 = foo 

আপনি যদি ব্যতিক্রম ব্যবহারে এটি ব্যবহার করতে চান তবে দ্রষ্টব্য:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

ডিক্লারিংটাইপ ঘোষণা করা হয় [Nullable(2)]যাতে নাল চেক সক্রিয় থাকাকালীন আপনি একটি সতর্কতা পান।
মার্টিন

@ মার্টিন, আপনার মন্তব্য ব্যাখ্যা করুন। আমি বুঝতে পারি না?
NoChance


2

Asp.net এর বর্তমান শ্রেণীর নাম পান

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();

1
ডিক্লারিংটাইপ ঘোষণা করা হয় [Nullable(2)]যাতে নাল চেক সক্রিয় থাকাকালীন আপনি একটি সতর্কতা পান।
মার্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.