2012-11-21 31 views
7

Tôi đang ở trong cửa sổ ngay lập tức trong Visual Studio. Có một biến số p. Làm cách nào để tôi có thể suy ra loại biến số p?Làm cách nào để xác định loại biến? (không phải loại đối tượng)

Tôi đã thử p.GetType() nhưng trả về loại đối tượng p. Trong trường hợp của tôi, đây là một loại rất cụ thể (ví dụ: đôi khi ChessPlayer, đôi khi TennisPlayer). Tôi muốn biết loại biến, tức là. loại xác định phương thức nào có sẵn trên biến số p.


Chỉnh sửa: Tôi nghĩ đây là một điều hợp lý để làm. Tôi đang cố kiểm tra biến số p nhưng tôi không biết nó là gì! Thông thường trong Visual Studio tôi chỉ cần di chuột trên biến và nó cho tôi biết kiểu của nó, hoặc tôi gõ . và tự động hoàn thành liệt kê các phương thức của nó. Tuy nhiên không ai trong số đó làm việc trong cửa sổ ngay lập tức, tất cả tôi có là biến này p Tôi không biết nó là gì hay những gì tôi có thể làm gì với nó :(

+0

Bạn đã thử 'p.GetType(). GetMethods()'? 'p.GetType(). GetInterfaces()'? – J0HN

+2

Mặc dù tôi tò mò muốn biết có cách nào để làm điều này, tôi sẽ không ngạc nhiên khi không có. Nếu bạn đang ở trong trình gỡ lỗi với một tay cầm trên 'p', bạn có thể _xem khai báo của' p' trong mã và do đó xem loại biến "của nó" là gì. – Rawling

+3

Chỉ cần làm rõ, khi làm 'BoardGamePlayer p = new ChessPlayer();', những gì bạn muốn là một cách để biết rằng 'p' được khai báo là' BoardGamePlayer'? –

Trả lời

3

Ngạc nhiên này là rất khó khăn, cuối cùng tôi đã viết phương pháp này, dường như đưa ra câu trả lời đúng.

public static class Extensions 
{ 
    public static Type GetVariableType<T>(this T instance) 
    { 
     return typeof(T); 
    } 
} 

Ví dụ sử dụng:

void Main() 
{ 
    IList x = new List<int>{}; 
    x.GetVariableType().Dump(); 
} 

Prints System.Collections.IList

0
System.Object.GetType() 

này sẽ trả lại cho bạn những loại biến vì lớp này ở phía trên cùng thứ bậc từ đó mỗi lớp có nguồn gốc.

bạn cũng có thể kiểm tra typeof chức năng để có được chính xác loại trường hợp nhất định.

+1

OP cho biết anh ta đã thử 'GetType'. Anh ta muốn kiểu biên dịch 'p', không phải kiểu thời gian chạy. – Rawling

+0

tốt, sau đó typeof sẽ là giải pháp khả thi cho việc này. –

5

C# cung cấp nhiều cách cho điều này :)

Đối với các bản sao chính xác của loại hình cụ thể mà bạn cần phải làm điều này

if (p.GetType() == typeof(YourDesiredType)) 

Nếu bạn muốn biết liệu p là một thể hiện của yourdesiredtype sau đó

if (p is YourDesiredType) 

hoặc bạn có thể thử này

YourDesiredType ydp = p as YourDesiredType; 

Như trong trường hợp này (vì tôi không chắc chắn rằng điều đó có thể xảy ra trong kịch bản của bạn) khi OP muốn biết loại biên dịch Then I wo ULD chỉ khuyên bạn nên sử dụng một danh sách chung cho việc này

Bởi vì bằng cách giữ Loại danh sách an toàn, mọi người có thể dễ dàng theo dõi cho loại hình của nó

+1

Đây là tất cả kiểm tra loại thời gian chạy. OP quan tâm đến loại biên dịch. – Rawling

+0

Anh ấy chỉ xóa sạch điều đó.Tôi nghĩ rằng không cần bỏ phiếu xuống: (ai đó đã làm – Freak

0

Tôi nghĩ rằng bạn có thể cần điều này

if (p is ChessPlayer) 
{ 
    ChessPlayer cp = (ChessPlayer)p; 

    //Use ChessPlayer methods 
} 
1

Là một thay thế để sử dụng cửa sổ ngay lập tức, nếu bạn chỉ muốn xem các loại biến, bạn chỉ có thể thêm một biến xem và kiểm tra loại trong cửa sổ xem.

Các vấn đề liên quan