Kiểm tra nếu thể hiện là một loại


181

Sử dụng điều này để kiểm tra nếu clà một ví dụ của TForm.

c.GetType().Name.CompareTo("TForm") == 0

Có cách nào an toàn hơn để làm điều đó ngoài việc sử dụng stringnhư một tham số CompareTo()không?


20
Tôi chắc chắn hy vọng bạn không làm điều đó trong Java theo cách đó. Java instanceofvà C # islà những cách tốt hơn để làm điều đó.
Powerlord

Câu trả lời:


410

Các câu trả lời khác nhau ở đây có hai ý nghĩa khác nhau.

Nếu bạn muốn kiểm tra xem một thể hiện là một loại chính xác sau đó

if (c.GetType() == typeof(TForm))

là con đường để đi

Nếu bạn muốn biết liệu clà một thể hiện của TForm hoặc một lớp con thì hãy sử dụng is/ as:

if (c is TForm)

hoặc là

TForm form = c as TForm;
if (form != null)

Điều đáng để bạn rõ ràng trong đầu về hành vi nào bạn thực sự muốn.


7
Một lưu ý nhỏ: sử dụng "là" nếu bạn không muốn sử dụng kết quả của dàn diễn viên và sử dụng "như" nếu bạn làm.
Aviram Fireberger 10/11/2015

14
Với C # 7, bạn có thể kết hợp isaskhớp mẫu:if (x is TForm tf) {…
Richard

39
if(c is TFrom)
{
   // Do Stuff
}

hoặc nếu bạn có kế hoạch sử dụng cnhư một TForm, hãy sử dụng ví dụ sau:

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}

Ví dụ thứ hai chỉ cần kiểm tra xem ccó thuộc loại TFormmột lần không. Trong trường hợp nếu bạn kiểm tra xem nếu cthuộc loại TFormthì hãy bỏ nó, CLR trải qua kiểm tra thêm. Đây là một tài liệu tham khảo .

Chỉnh sửa: Bị đánh cắp từ Jon Skeet

Nếu bạn muốn chắc chắn cTFormvà không phải bất kỳ lớp nào kế thừa từ TFormđó, thì hãy sử dụng

if(c.GetType() == typeof(TForm))
{
   // Do stuff cause c is of type TForm and nothing else
}


10

Ngoài ra, phần nào trong cùng một tĩnh mạch

Type.IsAssignableFrom(Type c)

"Đúng nếu c và Loại hiện tại biểu thị cùng loại hoặc nếu Loại hiện tại nằm trong phân cấp thừa kế của c hoặc nếu Loại hiện tại là giao diện mà c thực hiện hoặc nếu c là tham số loại chung và Loại hiện tại đại diện cho một trong những hạn chế của c. "

Từ đây: http://msdn.microsoft.com/en-us/l Library / system.type.isassignablefrom.aspx


đây cũng là sở thích cá nhân của tôi typeof(Class).IsAssignableFrom(object.getType())tương tự như instanceoftoán tử Java .
SkidRunner 7/11/2016

Liệu nó có sai hay không nếu chúng không nằm trong cùng một nhánh của hệ thống phân cấp thừa kế nhưng tồn tại một toán tử chuyển đổi?
Paul Stelian

Câu hỏi hay @PaulStelian. Tôi không chắc chắn trên đỉnh đầu của tôi nhưng tôi đoán nó sẽ trở lại sai trong tình huống đó. Đó ít nhất sẽ là hành vi mong đợi của tôi. Có thể nếu một chuyển đổi ngầm tồn tại, nó có thể trả về đúng nhưng đó là số lẻ.
Brad Cickyham

Bất cứ ai đã cài đặt Visual Studio để dùng thử?
Paul Stelian

1
@PaulStelian - nó trả về false. Điều này có thể được nhìn thấy bằng cách theo liên kết doc và quan sát không có đề cập đến chuyển đổi. Một cách khác để suy nghĩ về nó là T1.IsAssignableFrom(T2)trả về truetrong các tình huống mà astoán tử trả về giá trị khác null, với các thể hiện của các loại đó.
ToolmakerSteve

9

Nhỏ gọn hơn một chút so với các câu trả lời khác nếu bạn muốn sử dụng c làm TForm:

if(c is TForm form){
    form.DoStuff();
}


2

Như những người khác đã đề cập, từ khóa "là". Tuy nhiên, nếu sau này bạn sẽ chuyển nó sang loại đó, vd.

TForm t = (TForm)c;

Sau đó, bạn nên sử dụng từ khóa "như".

ví dụ TForm t = c as TForm.

Sau đó bạn có thể kiểm tra

if(t != null)
{
 // put TForm specific stuff here
}

Đừng kết hợp như với vì đó là một kiểm tra trùng lặp.



-1
bool isValid = c.GetType() == typeof(TForm) ? true : false;

hoặc đơn giản hơn

bool isValid = c.GetType() == typeof(TForm);

IMHO: Tôi sẽ tránh một lòng trắc ẩn trực tiếp (tức là. ==). Trong các ngôn ngữ đối tượng hoặc định hướng hỗ trợ kế thừa trừ khi bạn biết rằng Loại cụ thể của bạn sẽ không bao giờ được kế thừa từ một sealedLớp. Ngoài ra: việc sử dụng một toán tử ternary trả về các giá trị boolean (tĩnh / hằng) làm phiền tôi, tôi sẽ ít bận tâm hơn nếu đó là một switchcâu lệnh.
SkidRunner
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.