Cách so sánh các loại


130

Câu hỏi nhanh: làm thế nào để so sánh một loại Loại (chơi chữ không có ý định) với một loại khác trong C #? Ý tôi là, tôi đã là một Type typeFieldvà tôi muốn biết nếu nó là System.String, System.DateTime, vv, nhưng typeField.Equals(System.String)không làm việc.

Có manh mối nào không?

Câu trả lời:


179

Hãy thử như sau

typeField == typeof(string)
typeField == typeof(DateTime)

Các typeofnhà điều hành trong C # sẽ cung cấp cho bạn một Typeđối tượng cho kiểu đặt tên. Typetrường hợp tương đương với== toán tử vì vậy đây là một phương pháp tốt để so sánh chúng.

Lưu ý: Nếu tôi nhớ chính xác, có một số trường hợp điều này bị hỏng khi các loại liên quan là giao diện COM được nhúng vào các cụm (thông qua NoPIA). Không có vẻ như đây là trường hợp ở đây.


74

Bạn có thể sử dụng cho nó is toán tử . Sau đó, bạn có thể kiểm tra xem đối tượng có phải là loại cụ thể không bằng cách viết:

if (myObject is string)
{
  DoSomething()
}

3
Nó tốt hơn cho chúng ta "là" hay "typeof"?
Brent Wagoner

32

Bạn có thể so sánh chính xác cùng loại bằng cách sử dụng:

class A {
}
var a = new A();
var typeOfa = a.GetType();
if (typeOfa == typeof(A)) {
}

typeof trả về đối tượng Type từ một lớp nhất định.

Nhưng nếu bạn có loại B, kế thừa từ A, thì so sánh này là sai. Và bạn đang tìm kiếm IsAssignableFrom .

class B : A {
}
var b = new B();
var typeOfb = b.GetType();

if (typeOfb == typeof(A)) { // false
}

if (typeof(A).IsAssignableFrom(typeOfb)) { // true
}

7

Nếu trường hợp của bạn là Type:

Type typeFiled;
if (typeField == typeof(string))
{ 
    ... 
}

nhưng nếu cá thể của bạn là một objectvà không Typesử dụng astoán tử:

object value;
string text = value as string;
if (text != null)
{
    // value is a string and you can do your work here
}

điều này có lợi thế là valuechỉ chuyển đổi một lần thành loại được chỉ định.


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.