2011-12-01 35 views
13

Giả sử tôi có đối tượng, someDrink. Nó có thể thuộc loại CocaCola hoặc Pepsi mà cả hai đều thừa kế số Cola trừu tượng (được thừa hưởng Drink) hoặc bất kỳ loại thức uống nào cho vấn đề đó. Tôi có một phương thức trả về một chuỗi đồ uống ưa thích nhất.Kiểm tra xem loại đối tượng có kế thừa kiểu tóm tắt

public string PreferredDrink(Drink someDrink) 
{ 
    var orderOfPreference = new List<Type> { 
     typeof (Cola), 
     typeof (PurpleDrank), 
     typeof (LemonLimeBitters) 
     ... 
    } 

    foreach (drinkType in orderOfPreference) { 
     if (someDrink.GetType() == drinkType) { 
      return someDrink.ToString() 
     } 
    } 

    throw new Exception("Water will be fine thank you"); 
} 

Đoạn mã trên sẽ không làm việc, bởi vì loại someCola bao giờ có thể bằng một loại trừu tượng. Lý tưởng nhất là tôi muốn làm điều gì đó như:

if (someCola is drinkType) ... 

Nhưng từ khóa is chỉ cho phép tên lớp sau đó.

Có cách nào khác để kiểm tra xem someDrink có thừa kế một loại nhất định không?

Tái cấu trúc không phải là hoàn toàn ngoài câu hỏi nếu bạn có thể đề xuất cách tốt hơn để thực hiện việc này.

+0

Umm, theo tài liệu trên [System.Object.GetType] (http://msdn.microsoft.com/en-us/ library/system.object.gettype.aspx), nó trả về kiểu * thời gian chạy * chính xác của đối tượng. Vì vậy, nó sẽ không bao giờ trả lại "Uống rượu" trong trường hợp của bạn. Có thể có điều gì đó sai với mã gọi phương thức của bạn. – Strelok

Trả lời

23

chắc - bạn có thể sử dụng Type.IsAssignableFrom:

if (drinkType.IsAssignableFrom(someDrink.GetType())) 

Lưu ý rằng điều quan trọng là bạn không nhận được các mục tiêu của cuộc gọi và lập luận một cách sai lầm quanh. Tôi phải tham khảo tài liệu mỗi lần tôi sử dụng tài liệu, điều này thật may mắn hiếm khi :)

+0

Đã hoạt động, xuất sắc! – jamesrom

+0

Vì vậy, tôi không phải phân tích cú pháp thông qua câu hỏi mỗi khi tôi tìm thấy câu hỏi này trên Google vài tháng một lần, đó là 'if (parentType.IsAssignableFrom (child.GetType())'. – Seafish

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