Tôi biết isvà ascho instanceof, nhưng còn phương thức isInstance () phản chiếu thì sao?
Tôi biết isvà ascho 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 isInstancelấy một đối tượng làm đối số của nó, trong khi C # lại IsAssignableFrommong đợi một System.Typeđối tượng khác .
isngượ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 isnếu bạn không muốn sử dụng kết quả của việc đúc và sử dụng asnế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.