Genel bir tür bağımsız değişkeninin tür adını nasıl alırım?


108

Gibi bir yöntem imzam varsa

public string myMethod<T>( ... )

Yöntemin içinde, tür bağımsız değişkeni olarak verilen türün adını nasıl alabilirim? Buna benzer bir şey yapmak isterdim typeof(T).FullNameama bu aslında işe yarıyor ...


10
typeof(T).FullName gerektiğini çalışır. Bunun yerine ne oluyor?
Nathan Taylor

Bu ifadede derleyici hataları aldım - ama görünüşe göre bunlara başka bir şey neden oldu, çünkü şimdi çalışıyor. Teşekkürler!
Tomas Aschan

Yanıtlar:


172

Kodunuz çalışmalıdır. typeof(T).FullNametamamen geçerlidir. Bu, tamamen derleyen, işleyen bir programdır:

using System;

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

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

        Console.ReadKey();
    }

}

Yukarıdaki baskıları çalıştırmak (beklendiği gibi):

System.Int32

MyMethod <int>> () ile test ettiğinizden emin olun ve ne elde ettiğinizi görün ... Bu senaryoda temel alınan türle ilgileniyorsanız null yapılabilir türleri hesaba katmanız gerekir.
GR7

1
Yani " <int?>" Eğer öyleyse, işe yarıyor, ama elde edersiniz System.Nullable<int>(tam ad sözdiziminde), ki bu beklediğiniz şeydir ...
Reed Copsey

Çözüme zaten sahip olsam da (bir nedenden dolayı işe
yaramamasına

1
Ben farz beri bu sadece bana yardımcı oldu nameof(T)ve typeof(T).Nameaynı şeyi yapardı. Dışarı dönüşler nameof(T)sadece getiri T.
dahvyd

7

typeof(T).Nameve typeof(T).FullNamebenim için çalışıyor. Bir argüman olarak iletilen türü alıyorum.


1
Ah. Geçtiğiniz tür Nullable ise, temel alınan türü almak için typeof (T) gibi bir şey kullanmanız gerekir .GetGenericArguments () [0]
GR7

türün nullable olup olmadığını kontrol etmek için typeof (T) .IsGenericType kullanırsınız ve eğer öyleyse, Name veya FUllName ((Type) typeof (T) .GetGenericArguments () [0 İsim
GR7

1

Kullanılabilir bir T örneğiniz olduğunu varsayarsak, diğer türlerden farklı değildir.

var t = new T();

var name = t.GetType().FullName;

3
T .... tipof (T) örneğine bile ihtiyacınız yok, örnek olmadan iyi çalışıyor ... Yönteme bir alt sınıf geçirilirse (argüman olarak)
sizinki

1
Bu kodla ilgili sorun, T'nin parametresiz bir kurucuya sahip olmaması durumunda çalışmayacağıdır.
Nathan Taylor

@Nathan - T'nin bir örneğini aldığını göstermek için sadece bir örnekti. Muhtemelen jenerik bir yöntemde bir T tipine sahip olacaktır. @Reed - tabii ki haklısın, onun peşinde olduğunu varsaymıştım.
womp

Diğer bir sorun, T'nin soyut bir sınıf veya bir arayüz olması durumunda olacaktır - yukarıdaki kod çalışmayacaktır. Genel bir tür kısıtlaması ("nerede") olması durumunda, bu tür bir kod, kurucuyu bildiğimizden ve aslında türü başlatmak için nedenlere sahip olabileceğinden güvenli olabilir. Bunun dışında örnekleme israftır.
Andrew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.