2012-04-10 3 views
10

Tôi đang cố gắng để làm một cái gì đó như thế này:Làm thế nào để Unbox một đối tượng C# để động loại

void someMethod(TypeA object) { ... } 

void someMethod(TypeB object) { ... } 

object getObject() 
{ 
    if (...) return new TypeA(); 
    else return new TypeB(); 
} 

object obj = getObject(); 
(obj.GetType()) obj; // won't compile 
someMethod(obj); 

Rõ ràng là tôi đang bối rối đây. Tôi biết tôi có thể thực hiện công việc này bằng cách viết một tuyên bố có điều kiện -

if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj; 
else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj; 

- nhưng không có cách nào để thực hiện việc này khi chạy?

EDIT Tôi đồng ý có vẻ như không phải là lựa chọn thiết kế tốt nhất, vì vậy đây là ngữ cảnh. Điểm của mã trên là lớp cơ sở Repository cho Mongo DB. Tôi muốn nó có thể xử lý các loại bàn khác nhau. Vì vậy, someMethod() thực sự là xóa; và TypeA và TypeB là ObjectIDHướng dẫn; mã ở dưới cùng là một phần của phương thức loại bất khả xâm phạm loại chấp nhận ID làm chuỗi; và getObject() là một phương thức phân tích tham số ID.

+0

Bạn đang conflating một loại 'T' với loại thông tin thời gian chạy liên kết với nó: 'typeof (T) '. Chúng không giống nhau và không thể thay thế cho nhau. –

+0

Có thể có các lựa chọn thiết kế tốt hơn, nhưng bạn đã để lại mục tiêu thực sự của mã trong bài đăng của mình. Có lẽ chúng tôi có thể cung cấp cho bạn một cách tốt hơn và hoàn toàn khác để viết giải pháp cho vấn đề của bạn nếu bạn cho chúng tôi biết những gì bạn đang cố gắng thực hiện với mã này. –

+0

@Kirk Woll, tôi biết sự khác biệt, tôi chỉ muốn minh họa những gì tôi đang cố gắng làm. – McGarnagle

Trả lời

20

Nếu bạn đang sử dụng .NET 4 và C# 4, bạn có thể sử dụng dynamic cho việc này:

dynamic obj = GetObject(); 
SomeMethod(obj); 

Nếu không, bạn sẽ phải sử dụng phản ánh để tìm và gọi phương pháp đúng. Độ phân giải quá tải (đối với loại không dynamic) được thực hiện tại biên dịch -time.

(Lưu ý rằng trừ TypeATypeB là cấu trúc, bạn sẽ không unboxing anyway ...)

+0

hoặc 'obj.SomeMethod()'? –

+0

@RobertHarvey: Không được đưa ra cách câu hỏi được viết, nơi mà nó chọn quá tải trong cùng một loại. –

+0

Đẹp !! Chính xác những gì tôi đang tìm kiếm, cảm ơn bạn. – McGarnagle