Làm cách nào để lấy tên kiểu của đối số kiểu chung?


99

Nếu tôi có một chữ ký phương thức như

public string myMethod<T>( ... )

Làm cách nào để tôi có thể lấy tên của kiểu đã được cung cấp làm đối số bên trong phương thức này? Tôi muốn làm điều gì đó tương tự như typeof(T).FullName, nhưng điều đó thực sự hoạt động ...


10
typeof(T).FullName nên hoạt động. Thay vào đó, điều gì đang xảy ra?
Nathan Taylor

Tôi đã gặp lỗi trình biên dịch trên câu lệnh đó - nhưng rõ ràng chúng là do một cái gì đó khác gây ra, vì bây giờ nó đang hoạt động. Cảm ơn!
Tomas Aschan

Câu trả lời:


156

Mã của bạn sẽ hoạt động. typeof(T).FullNamelà hoàn toàn hợp lệ. Đây là một chương trình biên dịch đầy đủ, hoạt động:

using System;

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

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

        Console.ReadKey();
    }

}

Chạy các bản in trên (như mong đợi):

System.Int32

Đảm bảo kiểm tra nó với MyMethod <int>> () và xem những gì bạn nhận được ... bạn phải tính đến các loại nullable nếu bạn quan tâm đến loại cơ bản trong trường hợp đó.
GR7,

1
Bạn có nghĩa là " <int?>" Nếu vậy, nó hoạt động, nhưng bạn sẽ có được System.Nullable<int>(trong cú pháp rõ họ tên), đó là những gì bạn mong muốn ...
Reed Copsey

Mặc dù tôi đã có giải pháp (mặc dù nó đã không làm việc vì một lý do ...), tôi sẽ cung cấp cho bạn các điểm đại diện cho văn bản trả lời tốt nhất cho đến nay =)
Tomas Aschan

1
Điều này chỉ giúp tôi vì tôi đã giả định điều đó nameof(T)typeof(T).Namesẽ làm điều tương tự. Hóa ra nameof(T)chỉ trở về T.
dahvyd

5

typeof(T).Nametypeof(T).FullNameđang làm việc cho tôi. Tôi nhận được loại được truyền dưới dạng đối số.


1
Ah. Nếu loại bạn trôi qua là Nullable, để có được các loại cơ bản bạn sẽ phải sử dụng một cái gì đó giống như typeof (T) .GetGenericArguments () [0]
GR7

để kiểm tra xem loại nếu là nullable, bạn sẽ sử dụng typeof (T) .IsGenericType và nếu có, bạn sẽ sử dụng phần sau để lấy Name hoặc FUllName ((Type) typeof (T) .GetGenericArguments () [0 ]). Tên
GR7

1

Giả sử bạn có sẵn một số trường hợp của chữ T, nó không khác với bất kỳ loại nào khác.

var t = new T();

var name = t.GetType().FullName;

2
Bạn thậm chí không cần một phiên bản của T .... typeof (T) hoạt động tốt mà không có phiên bản nào ... Bạn sẽ đưa ra một hành vi khác nếu một lớp con được truyền vào phương thức (như một đối số) ..
Reed Copsey

1
Vấn đề với đoạn mã đó là nếu T không có hàm tạo không tham số thì nó sẽ không hoạt động.
Nathan Taylor

@Nathan - đó chỉ là một ví dụ cho thấy việc nhận một phiên bản T. Có lẽ trên một phương pháp chung, anh ta sẽ có sẵn một số loại T. @Reed - tất nhiên bạn đúng, tôi cho rằng đó là điều mà anh ấy đang theo đuổi.
womp

Một vấn đề khác sẽ xảy ra trong trường hợp T là một lớp trừu tượng hoặc một giao diện - đoạn mã trên sẽ không hoạt động. Trong trường hợp có ràng buộc kiểu chung ("ở đâu") thì loại mã này có thể an toàn vì chúng ta biết hàm tạo và thực sự có thể có lý do để khởi tạo kiểu. Khác với việc khởi tạo đó là lãng phí.
Andrew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.