বেস ক্লাস থেকে ডাকলে কি গেটটাইপ () সর্বাধিক উদ্ভূত প্রকারটি ফেরত দেবে?


118

বেস ক্লাস থেকে ডাকলে কি গেটটাইপ () সর্বাধিক উদ্ভূত প্রকারটি ফেরত দেবে?

উদাহরণ:

public abstract class A
{
    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(this.GetType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them
}

বা আমি কি কেবল একটি বিমূর্ত পদ্ধতি তৈরি করতে পারি যা উত্পন্ন ক্লাসগুলিকে নিম্নলিখিতগুলির মতো প্রয়োগ করতে হবে?

public abstract class A
{
    protected abstract Type GetSubType();

    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(GetSubType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them

   protected Type GetSubType()
   {
       return GetType();
   }
}

10
ভাল - আপনি এটি চেষ্টা করে?
ব্রোকেনগ্লাস

2
@ ব্রোকেনগ্লাস সাধারণত আমি এটি করতাম তবে আমি কম্পিউটারে নই ... পোস্টটি তৈরি করার জন্য আমার ফোনটি ব্যবহার করেছি কারণ কোনও সমস্যার সমাধানের সূচনা শুরু হয়েছিল এবং আমি এখন জানতে আগ্রহী! = পি
ফিস্টি আমের

উত্তর:


133

GetType()আসল, তাত্ক্ষণিক প্রকারটি ফিরিয়ে দেবে। আপনার ক্ষেত্রে, আপনি যদি GetType()কোনও উদাহরণে কল করেন তবে Bএটি ফেরত আসবে typeof(B), এমনকি যদি প্রশ্নটির পরিবর্তনশীলটিকে একটি এর রেফারেন্স হিসাবে ঘোষণা করা হয় A

আপনার GetSubType()পদ্ধতির কোনও কারণ নেই ।


এটা যদিও না? আমি এর (বিমূর্ত) সুপার বর্গ থেকে কোনও বস্তুর উদাহরণ দিয়ে যাচ্ছি, প্রাপক কেবল সুপার ক্লাস দেখেন। হ্যান্ডেলটি উদাহরণ হিসাবে বর্ণনা না করা যা এটি সর্বদা ফিরে আসবে তা কি নয়? - বা আমি কিছু মিস করছি?

আহ হা .. পার্থক্যটি টাইপফ (এক্স) বনাম এক্স.গেটটাইপ () আমার মনে হয়

22

GetTypeপ্রকৃতপক্ষে তাত্ক্ষণিকভাবে টাইপটি সর্বদা প্রদান করে। অর্থাত্ সর্বাধিক উদ্ভূত প্রকার। এর অর্থ আপনার নিজের GetSubTypeমতো GetTypeকরে আচরণ করা এবং এটি অপ্রয়োজনীয়।

স্ট্যাটিকালি কোনও ধরণের টাইপ তথ্য আপনি ব্যবহার করতে পারেন তা পেতে typeof(MyClass)

: আপনার কোড ভুল যদিও হয়েছে System.Attribute.GetCustomAttributesআয় Attribute[]না Type


7

গেটটাইপ সবসময় আসল টাইপ দেয়।

এর কারণগুলি .NET ফ্রেমওয়ার্ক এবং সিএলআর গভীর , কারণ জেআইটি এবং সিএলআর .GetTypeমেমরির মধ্যে একটি টাইপ অবজেক্ট তৈরি করতে পদ্ধতিটি ব্যবহার করে যা বস্তুর উপর তথ্য ধারণ করে এবং অবজেক্ট এবং সংকলনের সমস্ত অ্যাক্সেস এই টাইপ উদাহরণটির মাধ্যমে হয় ।

আরও তথ্যের জন্য মাইক্রোসফ্ট প্রেস থেকে "সিএলআর মাধ্যমে সি #" বইটি দেখুন।

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