Để cắt một câu chuyện dài, tôi có một hàm C# thực hiện một nhiệm vụ trên một Kiểu đã cho được truyền vào như một cá thể đối tượng. Tất cả đều hoạt động tốt khi một cá thể lớp được truyền vào. Tuy nhiên, khi đối tượng được khai báo là một giao diện, tôi thực sự muốn tìm lớp bê tông và thực hiện hành động theo kiểu lớp đó.Tìm Loại Bê tông phía sau một thể hiện Giao diện
Dưới đây là ví dụ phổ biến xấu (rực rỡ với tài sản không đúng vỏ vv):
public interface IA
{
int a { get; set; }
}
public class B : IA
{
public int a { get; set; }
public int b { get; set; }
}
public class C : IA
{
public int a { get; set; }
public int c { get; set; }
}
// snip
IA myBObject = new B();
PerformAction(myBObject);
IA myCObject = new C();
PerformAction(myCObject);
// snip
void PerformAction(object myObject)
{
Type objectType = myObject.GetType(); // Here is where I get typeof(IA)
if (objectType.IsInterface)
{
// I want to determine the actual Concrete Type, i.e. either B or C
// objectType = DetermineConcreteType(objectType);
}
// snip - other actions on objectType
}
Tôi muốn mã trong PerformAction sử dụng Reflection chống lại nó là tham số và thấy rằng nó không chỉ là một thể hiện của IA nhưng đó là một thể hiện của B và để xem thuộc tính "b" qua GetProperties(). Nếu tôi sử dụng .GetType() Tôi lấy kiểu IA - không phải cái tôi muốn.
Làm cách nào để PerformAction có thể xác định Loại bê tông cơ bản của cá thể IA?
Một số có thể bị cám dỗ đề xuất sử dụng lớp Tóm tắt nhưng đó chỉ là giới hạn của ví dụ xấu của tôi. Biến này ban đầu sẽ được khai báo là một thể hiện giao diện.
Điều này nghe có vẻ tồi tệ. Bạn nên sử dụng đa hình thay vì có phương pháp của bạn biết về các loại cụ thể cụ thể. Điều gì sẽ xảy ra nếu bạn thêm sau? –
Điều đó không đánh bại mục đích của một giao diện? Bạn không nên quan tâm loại bê tông là gì miễn là nó thực hiện giao diện. –
+1 với John và Chris, không chỉ là thiết kế tồi, nhưng câu hỏi không có ý nghĩa gì cả. –