পুরো নামস্থান ছাড়াই টাইপ নাম পান


293

আমার কাছে নিম্নলিখিত কোড রয়েছে:

return "[Inserted new " + typeof(T).ToString() + "]";

কিন্তু

 typeof(T).ToString()

নেমস্পেস সহ পুরো নাম দেয়

কেবল ক্লাসের নাম (কোনও নামস্থান যোগ্যতা ছাড়াই?) পাওয়ার কী আছে?


7
ঘটনাক্রমে, লেখাটি string1 + anything.ToString() + string2নিরর্থক। সংকলক ToStringস্বয়ংক্রিয়ভাবে কল সন্নিবেশ করান যদি আপনি তা করেন string1 + anything + string2
টিম রবিনসন

13
কঠোর শোনার জন্য নয়, Typeউদাহরণস্বরূপ কোন বৈশিষ্ট্য উপলব্ধ রয়েছে তা যদি আপনি পরীক্ষা করে typeof(..)
দেখেন

উত্তর:


530
typeof(T).Name // class name, no namespace
typeof(T).FullName // namespace and class name
typeof(T).Namespace // namespace, no class name

5
Nameধরণের পরামিতি বিবেচনা করে না।
গ্রেগসডেনিস

73
বা this.GetType().Name, this.GetType().FullNameইত্যাদি যদি উদাহরণগুলির সাথে কাজ করে।
অ্যাভেনমোর

1
Nameনেস্টেড প্রকারগুলিও বিবেচনা করে না!
যুদ্ধের মতো শিম্পাঞ্জি

33

জেনেরিক ধরণের জন্য টাইপ পরামিতি পেতে এটি চেষ্টা করুন:

public static string CSharpName(this Type type)
{
    var sb = new StringBuilder();
    var name = type.Name;
    if (!type.IsGenericType) return name;
    sb.Append(name.Substring(0, name.IndexOf('`')));
    sb.Append("<");
    sb.Append(string.Join(", ", type.GetGenericArguments()
                                    .Select(t => t.CSharpName())));
    sb.Append(">");
    return sb.ToString();
}

সম্ভবত সেরা সমাধান নয় (পুনরাবৃত্তির কারণে), তবে এটি কার্যকর হয়। আউটপুটগুলি দেখতে দেখতে:

Dictionary<String, Object>

3
এটি অবশ্যই গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি জেনেরিক ধরণগুলি যথাযথভাবে বিবেচনা করে যা পুনরাবৃত্তি করতে পারে (উদাহরণস্বরূপ অভিধান <<? Int?>)।
ওটিস

ধারণার জন্য +1। তবে ব্যর্থ অকাল অপ্টিমাইজেশন অপছন্দ করুন। এটি প্রতিটি পুনরাবৃত্তির কলটিতে একটি নতুন তৈরি করে StringBuilder(এমনকি এটি অব্যবহৃত হলে বেস কেস), তবুও string.Joinঅস্থায়ী এবং লিনকু ল্যাম্বদা উপেক্ষা করে । Stringযতক্ষণ না আপনি জানেন যে এটি কোনও বাধা Just / অভিজাত
নাইজেল টাচ

1
নাইজেল, এটি ঠিক বলেছেন যে সম্ভবত এটি সেরা সমাধান নয় :)
গ্রেসডেনিস

সংক্ষিপ্ত নাম একটি সংক্ষিপ্ত নাম :)
ভ্যালেরা



5

পরে সি # 6.0 (সহ) আপনি ব্যবহার করতে পারেন nameof অভিব্যক্তি:

using Stuff = Some.Cool.Functionality  
class C {  
    static int Method1 (string x, int y) {}  
    static int Method1 (string x, string y) {}  
    int Method2 (int z) {}  
    string f<T>() => nameof(T);  
}  

var c = new C()  

nameof(C) -> "C"  
nameof(C.Method1) -> "Method1"   
nameof(C.Method2) -> "Method2"  
nameof(c.Method1) -> "Method1"   
nameof(c.Method2) -> "Method2"  
nameof(z) -> "z" // inside of Method2 ok, inside Method1 is a compiler error  
nameof(Stuff) = "Stuff"  
nameof(T) -> "T" // works inside of method but not in attributes on the method  
nameof(f) -> f  
nameof(f<T>) -> syntax error  
nameof(f<>) -> syntax error  
nameof(Method2()) -> error This expression does not have a name  

বিঃদ্রঃ! nameofঅন্তর্নিহিত অবজেক্টের রানটাইম টাইপ পাবেন না, এটি কেবল সংকলন-সময় আর্গুমেন্ট। যদি কোনও পদ্ধতি কোনও আইনুনিউরেবল গ্রহণ করে তবে নামাফ কেবল "আইইনুমারেবল" ফিরিয়ে দেয়, যেখানে আসল অবজেক্টটি "তালিকা" হতে পারে।



@NigelTouch আমি চেক করেছি এবং nameofনাম আসতে Type, সঙ্গে প্রমাণ স্ক্রীনশট: prntscr.com/irfk2c
Stas Boyarincev

1
দুঃখিত, আমি ভাল ব্যাখ্যা করিনি। আমার অর্থটি হ'ল এটি অন্তর্নিহিত বস্তুর রানটাইমটি পায় না Type, এটি কেবল সংকলন-সময় আর্গুমেন্ট। যদি কোনও পদ্ধতি গ্রহণ করে IEnumerableতবে nameofকেবল "আইনিউমেবল" ফিরিয়ে দেয়, যেখানে আসল অবজেক্টটি "তালিকা <স্ট্রিং>" হতে পারে। এটি ওপির প্রশ্নের উত্তর দেয় বলে মনে হয় না।
নাইজেল টাচ

-2

ব্যবহারের সেরা উপায়:

obj.GetType().BaseType.Name

1
অন্যান্য উত্তরদাতাদের আরও স্পষ্ট করতে দয়া করে আপনার উত্তরের কিছু ব্যাখ্যা সরবরাহ করুন।
স্ট্যানিস্লাভ মেখোনোশিন

আমি একবার "গেটটাইপ ()। নাম" খুঁজে পেয়েছি যা ভার্চুয়াল ফাংশনের ভিতরে ঠিক এমনভাবে লেখা হয়েছিল। কেউ আমাকে ব্যাখ্যা করতে পারেন কেন এতে আপত্তি নেই? গেটটাইপ ()। বেসটাইপ.নাম? আমি শিখছি. আমি উদ্দেশ্যটি বুঝতে পারি তবে সমস্ত সিনট্যাক্সের বিশদটি জানি না। ধন্যবাদ.
দিয়েগো ওরেলালানা

বেস টাইপ এর সাথে কি করতে পারে?
জননি 5

আমার পরীক্ষার obj.GetType().BaseType.Nameরিটার্ন "TypeInfo"যা প্রত্যাশা মতো চাওয়া সমাধান নয়।
নাসেনবায়ের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.