জেনেরিক ধরণের আর্গুমেন্টের টাইপ নামটি কীভাবে পাব?


102

আমার কাছে যদি কোনও পদ্ধতি স্বাক্ষর থাকে

public string myMethod<T>( ... )

আমি কীভাবে পদ্ধতির অভ্যন্তরে টাইপ আর্গুমেন্ট হিসাবে টাইপটির নাম পেতে পারি? আমি এর মতো কিছু করতে চাই typeof(T).FullName, তবে এটি আসলে কাজ করে ...


10
typeof(T).FullName কাজ করা উচিত । পরিবর্তে কি ঘটছে?
নাথান টেলর

আমি এই বিবৃতিতে সংকলক ত্রুটি পেয়েছি - তবে দৃশ্যত এগুলি অন্য কোনও কারণে হয়েছিল, কারণ এখন এটি কাজ করছে। ধন্যবাদ!
টমাস আসচান

উত্তর:


164

আপনার কোড কাজ করা উচিত। typeof(T).FullNameপুরোপুরি বৈধ। এটি একটি সম্পূর্ণ সংকলন, কার্যকারী প্রোগ্রাম:

using System;

class Program 
{
    public static string MyMethod<T>()
    {
        return typeof(T).FullName;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(MyMethod<int>());

        Console.ReadKey();
    }

}

উপরের প্রিন্টগুলি চালানো (আশানুরূপ হিসাবে):

System.Int32

এটি MyMethod <int>> () দিয়ে পরীক্ষা করে দেখুন এবং আপনি কী পান তা দেখুন ... আপনি যদি সেই দৃশ্যের অন্তর্নিহিত ধরণের যত্ন নেন তবে আপনাকে নালার ধরণের জন্য অ্যাকাউন্ট করতে হবে।
জিআর 7

4
আপনার অর্থ " <int?>" যদি তাই হয় তবে এটি কার্যকর হয় তবে আপনি System.Nullable<int>(পুরো নাম সিনট্যাক্সে) পান যা আপনি প্রত্যাশা করতেন ...
রিড কোপসি

যদিও আমার কাছে ইতিমধ্যে সমাধানটি ছিল (যদিও এটি কোনও কারণে কার্যকর হয়নি ...), আমি আপনাকে সেরা উত্তর লেখার জন্য রেপ পয়েন্ট দেব =)
টমাস আসচন

4
আমি এটি ধরে নিয়েছি nameof(T)এবং typeof(T).Nameএকই কাজটি করব তাই এটি কেবল আমাকে সহায়তা করেছিল । সক্রিয় আউট nameof(T)মাত্র আয় T
dahvyd

7

typeof(T).Nameএবং typeof(T).FullNameআমার জন্য কাজ করছে। আমি আর্গুমেন্ট হিসাবে টাইপটি পাস করি।


4
আহ। আপনি যে ধরণের পাস করেছেন তা যদি নুলযোগ্য হয় তবে অন্তর্নিহিত প্রকারটি পেতে আপনাকে টাইপফ (টি) এর মতো কিছু ব্যবহার করতে হবে GGetGenericArguments () [0]
জিআর 7

প্রকারটি প্রবণযোগ্য কিনা তা পরীক্ষা করতে আপনি টাইপফ (টি) ব্যবহার করুন। ])। নাম
জিআর 7

1

ধরে নিই যে আপনার কাছে কোনও টি উপলক্ষ্য রয়েছে, এটি অন্য কোনও ধরণের চেয়ে আলাদা নয়।

var t = new T();

var name = t.GetType().FullName;

4
আপনার এমনকি টি এর কোনও উদাহরণও প্রয়োজন নেই .... টাইপফ (টি) কোনও উদাহরণ ছাড়াই ঠিকঠাক কাজ করে ... আপনি যদি একটি সাবক্লাস পদ্ধতিতে (আর্গুমেন্ট হিসাবে) পাস করেন তবে আপনার আলাদা আচরণ দেওয়া হবে ..
রিড কোপসি

4
এই কোডটি নিয়ে সমস্যাটি হ'ল টিতে যদি প্যারামিটারলেস কনস্ট্রাক্টর না থাকে তবে এটি কাজ করবে না।
নাথান টেলর

@ নাথান - এটি টি এর উদাহরণ পাওয়া মাত্র একটি উদাহরণ ছিল সম্ভবত একটি জেনেরিক পদ্ধতিতে তার কিছু টি টাইপ উপলব্ধ থাকবে। @ রেড - আপনি অবশ্যই সঠিক, আমি ধরে নিয়েছিলাম যে তিনি তাঁর পরে ছিলেন।
womp

অন্য সমস্যাটি টির ক্ষেত্রে একটি বিমূর্ত শ্রেণি বা একটি ইন্টারফেস হয় - উপরের কোডটি কাজ করবে না। জেনেরিক ধরণের সীমাবদ্ধতার ক্ষেত্রে ("যেখানে") তখন এই ধরণের কোডটি সুরক্ষিত হতে পারে যেহেতু আমরা কনস্ট্রাক্টরকে জানি এবং প্রকৃতপক্ষে টাইপটি ইনস্ট্যান্ট করার কারণ থাকতে পারে। তাত্ক্ষণিক ব্যতীত অপব্যয়।
অ্যান্ড্রু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.