Tôi biết is
và as
cho instanceof
, nhưng còn phương thức isInstance () phản chiếu thì sao?
Tôi biết is
và as
cho instanceof
, nhưng còn phương thức isInstance () phản chiếu thì sao?
Câu trả lời:
Tương đương với 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 # đều hoạt động trên đối tượng kiểu thời gian chạy (Java java.lang.Class
≣ C # System.Type
) của một obj
(qua .getClass()
vs .getType()
), Java isInstance
lấy một đối tượng làm đối số của nó, trong khi C # lại IsAssignableFrom
mong đợi một System.Type
đối tượng khác .
is
ngược lại, yêu cầu một tên loại. Đây là những gì OP muốn: tương đương với Java isInstance
. Câu trả lời khác chỉ đơn giản là sai mặc dù số lượng ủng hộ vô lý.
bool result = (obj is MyClass); // Better than using 'as'
new Child() is Parent
)
Tùy, sử dụng is
nếu bạn không muốn sử dụng kết quả của việc đúc 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;
}
chỉ cần 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 cái nào sẽ hoạt động tốt hơn. Tôi sẽ giao nó cho người khác để đánh giá :)
Mã dưới đây có thể được thay thế cho IsAssignableFrom
.
parentObject.GetType().IsInstanceOfType(inheritedObject)
Xem mô tả Type.IsInstanceOfType trong MSDN.