tôi sẽ bắt đầu bằng cách giải thích kịch bản của tôi trong mã:C# .NET - Làm thế nào tôi có thể lấy typeof() để làm việc với thừa kế?
public class A { }
public class B : A { }
public class C : B { }
public class D { }
public class Test
{
private A a = new A () ;
private B b = new B () ;
private C c = new C () ;
private D d = new D () ;
public Test ()
{
// Evaluates to "false"
if (a.GetType == typeof(B)) { } //TODO: Add Logic
// Evaluates to "true"
if (b.GetType == typeof(B)) { } //TODO: Add Logic
// I WANT this to evaluate to "true"
if (c.GetType == typeof(B)) { } //TODO: Add Logic
// Evaluates to "false"
if (d.GetType == typeof(B)) { } //TODO: Add Logic
}
}
Điểm mấu quan trọng phải chú ý đến ở đây là:
if (c.GetType == typeof(B)) { }
Tôi tin rằng điều này sẽ thực sự đánh giá để " sai ", vì typeof (B) và typeof (C) không bằng nhau theo cả hai hướng. (C là B, nhưng B không nhất thiết phải là C.)
Nhưng điều tôi cần là một số loại điều kiện sẽ tính đến điều này. Làm thế nào tôi có thể nói nếu một đối tượng là một B hoặc bất cứ điều gì bắt nguồn từ nó?
Tôi không quan tâm nếu nó là một đối tượng DERIVED từ B, miễn là lớp B cơ sở có ở đó. Và tôi không thể dự đoán lớp dẫn xuất nào có thể hiển thị trong ứng dụng của tôi. Tôi chỉ phải giả định rằng các lớp dẫn xuất không rõ ràng có thể tồn tại trong tương lai - và do đó tôi chỉ có thể tập trung vào việc đảm bảo rằng lớp cơ sở là những gì tôi mong đợi.
Tôi cần một điều kiện sẽ thực hiện kiểm tra này cho tôi. Làm thế nào điều này có thể được thực hiện?
Bạn nên tránh loại logic này nếu có thể. Khi bạn phải xác định loại có nguồn gốc của một đối tượng là gì, bạn không sử dụng tốt tính đa hình. –
Xem nhận xét của tôi về câu trả lời của Steven Sudit. – Giffyguy