2008-11-11 39 views

Trả lời

47

Tương đương Java obj.getClass().isInstance(otherObj) trong C# như sau:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType()); 

Lưu ý rằng trong khi cả Java và C# làm việc trên các loại runtime đối tượng (Java java.lang.Class ≣ C# System.Type) của một obj (thông qua .getClass() vs .getType()), isInstance của Java lấy đối tượng làm đối số của nó, trong khi đối tượng IsAssignableFrom của C# mong đợi một đối tượng System.Type khác.

+1

Lưu ý IsAssignableFrom lấy một loại, không phải là một đối tượng, vì vậy bạn cần phải thực sự làm OtherObj.getType(). – FlySwat

+3

Cảm ơn Jon - và hãy nhớ, đây là một wiki! Tôi không oán trách mọi người sửa lỗi của mình. –

+1

thú vị ... trong java, JVM xử lý "instanceof" đặc biệt, dường như nó rất nhanh, có thể giải thích tại sao một từ khóa bất thường của nó (cũng có một phương thức isAssignable trong java). –

2

chỉ ra khỏi đỉnh đầu của tôi, bạn cũng có thể làm:

bool result = ((obj as MyClass) != null) 

Không chắc mà sẽ thực hiện tốt hơn. Tôi sẽ để lại nó lên cho người khác để chuẩn :)

172
bool result = (obj is MyClass); // Better than using 'as' 
+0

Nó có hoạt động ngay cả đối với các lớp sử dụng thừa kế không? ('new Child() là Parent') –

+2

có nó, chính xác như thế nào bạn hiển thị trên –

+0

thử nghiệm ở đây, nó hoạt động cho các lớp học mà người dùng thừa kế. Cảm ơn người đàn ông. –

36

Phụ thuộc, sử dụng is nếu bạn không muốn sử dụng kết quả của các diễn viên và sử dụng as nếu bạn làm. Bạn hầu như không bao giờ muốn viết:

if(foo is Bar) { 
    return (Bar)foo; 
} 

Thay vì:

var bar = foo as Bar; 
if(bar != null) { 
    return bar; 
} 
3

Dưới mã có thể được thay thế cho IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject) 

Xem Type.IsInstanceOfType mô tả trong MSDN.

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