সিস্টেম # টাইপ এবং সিস্টেমের মধ্যে পার্থক্য কী? সি # তে রুনটাইম টাইপ?


90

আমি আজ কিছু কনভেনশন টেস্ট করার চেষ্টা করছিলাম এবং কোনও সম্মেলনে (কল করে Assembly.GetTypes()) সমস্ত ধরণের আসার চেষ্টা করছিলাম:

System.RuntimeType:[First.Namespace.FirstClass]

আমি যখনই এই ধরণের সাথে তুলনা করার চেষ্টা করি তখন typeof(FirstClass)তারা সমান হয় না। সুতরাং, যখন আমি FirstClassজেনেরিক প্যারামিটার হিসাবে থাকা সমস্ত ধরণের সন্ধান করার চেষ্টা করি তখন আমি কোনও খুঁজে পাই না।

মধ্যে পার্থক্য কি System.RuntimeTypeএবং System.Type?

আমার সমস্যা সমাধানের কোন উপায় আছে?


6
আপনি কি এমন একটি ছোট প্রোগ্রাম সরবরাহ করতে পারেন যা আপনি যে সমস্যার সম্মুখীন হচ্ছেন তা প্রদর্শন করে?
এরিক লিপার্ট

আমি যাচ্ছি, তবে ইতিমধ্যে উত্তর পেয়েছি: পি
এডগার গঞ্জালেজ

উত্তর:


109

System.RuntimeTypeবিমূর্ত বেস বর্গ থেকে উদ্ভূত একটি কংক্রিট বর্গ System.Type। যেহেতু System.RuntimeTypeসর্বজনীন নয়, আপনি সাধারণত এর উদাহরণগুলির মুখোমুখি হবেন System.Type

আপনি যখন কোনও অবজেক্টের ধরণ পাওয়ার চেষ্টা করছেন এবং ভুলভাবে GetType()অন্য কোনও বস্তুকে ডেকে আনুন যখন সরাসরি সেই অবজেক্টটি সরাসরি ব্যবহার না করে প্রথম অবজেক্টের ধরণের প্রতিনিধিত্ব করবেন তখন বিভ্রান্তি দেখা দিতে পারে । তারপরে Type.ToString()প্রত্যাবর্তিত "System.RuntimeType"বস্তুটি কোনও প্রকারের প্রতিনিধিত্ব করে যখন ফিরে আসবে :

string str = string.Empty;
Type strType = str.GetType();
Type strTypeType = strType.GetType();
strType.ToString();     // returns "System.string"
strTypeType.ToString(); // returns "System.RuntimeType"

উদাহরণস্বরূপ, এই ব্লগ পোস্টে কেউ ডাটাবেসে কোনও কলামের ধরণ পাওয়ার চেষ্টা করছেন, এমন কিছু করছেন:

object val = reader.GetFieldType(index);
Type runtimeType = val.GetType();
PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType");
Type type = (Type)propInfo.GetValue(val, null);

যেহেতু ভ্যাল ইতিমধ্যে একটি টাইপ অবজেক্ট, তাই ভাল.গেটটাইপ () অন্য প্রকারের প্রতিনিধিত্ব করে অন্য ধরণের অবজেক্টকে প্রত্যাবর্তন করবে System.RuntimeTimeকারণ এটি মূল প্রকারের অবজেক্টকে উপস্থাপন করতে ব্যবহৃত কংক্রিট প্রকার। মূল ধরণের অবজেক্টের ধরণের জন্য ব্লগ পোস্টটি তখন কিছু অপ্রয়োজনীয় প্রতিচ্ছবি কৌশল দেখায়, যখন সত্যিকারের যা যা প্রয়োজন ছিল তা হ'ল:

Type type = reader.GetFieldType(index) as Type;

সুতরাং যদি আপনার Typeঅবজেক্টটি এটির প্রতিনিধিত্ব করে বলে জানাচ্ছে, তবে System.RuntimeTypeনিশ্চিত হয়ে নিন যে আপনি GetType()ইতিমধ্যে পেয়েছেন এমন কোনও ধরণের ঘটনা ঘটনাক্রমে ঘটেনি।


প্রথম কোড স্নিপেট কেবল তখনই পরীক্ষা করে যদি বস্তুটির উদাহরণ হয় Typeyou তবে আপনি পাস করলেও সত্য ফিরে আসবে typeof(int)। দ্বিতীয় কোড স্নিপেট তুলনা করার জন্য কাজ করে না typeof(string).GetType()এবং typeof(Type)
মার্ক সিডে

আমি ঠিক এটিই খুঁজছিলাম! আমি টমাস ডেনেকারের পোস্ট পেয়েছি তবে ডুগাল বেলের নয়
এডগার গঞ্জালেজ

4
@ মার্ক সিডেড ভাল দাগ, ধন্যবাদ। আরও সহায়ক হওয়ার জন্য নির্দিষ্ট উত্তর দিন, আশা করি সেই ব্লগ পোস্টটি উদ্ধৃত করে আমি যে কোনও বিভ্রান্তি প্রকাশ করেছি।
এরগওয়ান

@ অ্যাডগার গঞ্জালেজ: আমি যে ব্লগ পোস্টটি উল্লেখ করেছি তা আসলে বিভ্রান্তিকর ছিল। আরও ভাল তথ্যের জন্য আমার আপডেট উত্তর দেখুন।
এরগওয়ান

4

উত্তর থেকে System.Type এবং System.RuntimeType মধ্যে পার্থক্য দ্বারা টমাস Danecker :

System.Type একটি বিমূর্ত বেস ক্লাস। সিএলআর এর অভ্যন্তরীণ প্রকারের সিস্টেমে এটি কার্যকর রয়েছে। রুনটাইম টাইপ। এই টাইপের কারণে (স্ট্রিং) .গেটটাইপ () একটি রানটাইম টাইপ দেয় তবে টাইপফ (টাইপ) একটি সাধারণ টাইপ দেয়। .Equals পদ্ধতিটি ব্যবহার করা আসলে একটি বস্তু হয় eReferencesEquals যা মিথ্যা প্রত্যাবর্তন করে। প্রত্যাশিত ফলাফল পেতে, আপনি টাইপ.আইএসআইন্সট্যান্স অফ টাইপ (উপাদান) ব্যবহার করতে পারেন। উপাদানটি যদি উদ্ভূত প্রকারের হয় তবে এটিও সত্য হবে। আপনি যদি সঠিক ধরণের জন্য যাচাই করতে চান তবে আপনার পদ্ধতির মিথ্যাটির রিটার্ন-মানটি পছন্দসই ফলাফল। রানটাইম টাইপ পরীক্ষা করার জন্য আপনি চেকটাইপ (অ্যারে টাইপ, টাইপ.গেটটাইপ ("সিস্টেম.রুনটাইম টাইপ")) ব্যবহার করতে পারেন।


4
"আসলে একটি করে" - আমরা কি ব্যাকরণ সংশোধন পেতে পারি? এটি পুরো জিনিসটির ক্রুসের মতো এবং এটি কোনও অর্থ দেয় না।
N73k

2

সংক্ষেপে...

    "".GetType().ToString()           == "System.String"

    "".GetType().GetType().ToString() == "System.RuntimeType"

আমি এখন এটি সম্পর্কে যেভাবে ভাবছি তা হ'ল সেই System.Typeধরণের একটি বেস টাইপ যা রানটাইমের সময় অবজেক্ট টাইপের অনুরোধের ফলাফলগুলি উপস্থাপন করে, যথা System.RuntimeType। সুতরাং, যখন আপনি কোনও বস্তুর প্রকারের অনুরোধ করবেন, যেমন আছে, ফিরে "".GetType()আসা উদাহরণটি System.Typeহ'ল এটি বংশধর System.RuntimeType,। আসলে, একজনেরও আশা করা উচিত যে এটির পাশাপাশি typeof(System.Type).GetType()হওয়া উচিত System.RuntimeType, তবে আমি মনে করি কাঠামোটি বিশেষভাবে এটি ... প্রতিসাম্যতা রোধ করে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.