Dựa trên câu hỏi sau được hỏi vài ngày trước trong SO: GetType () và tính đa hình và đọc câu trả lời của Eric Lippert , tôi bắt đầu nghĩ rằng nếu việc tạo GetType()không ảo thực sự đảm bảo rằng một đối tượng không thể nói dối về nó Type.
Cụ thể, câu trả lời của Eric nêu rõ như sau:
Các nhà thiết kế khung sẽ không thêm một tính năng cực kỳ nguy hiểm như cho phép một đối tượng nói dối về kiểu của nó chỉ để làm cho nó phù hợp với ba phương pháp khác trên cùng một kiểu.
Bây giờ câu hỏi là: Tôi có thể làm cho một đối tượng mà không nói dối về loại hình của nó mà không có nó là ngay lập tức rõ ràng? Tôi có thể đã sai sâu sắc ở đây và tôi muốn làm rõ nếu đúng như vậy, nhưng hãy xem xét đoạn mã sau:
public interface IFoo
{
Type GetType();
}
Và hai cách triển khai sau của giao diện nói trên:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
Sau đó, nếu bạn chạy chương trình đơn giản sau:
static void Main(string[] args)
{
IFoo badFoo = new BadFoo();
IFoo niceFoo = new NiceFoo();
Console.WriteLine("BadFoo says he's a '{0}'", badFoo.GetType().ToString());
Console.WriteLine("NiceFoo says he's a '{0}'", niceFoo.GetType().ToString());
Console.ReadLine();
}
Chắc chắn đủ badFoođầu ra một lỗi Type.
Bây giờ tôi không biết liệu điều này có bất kỳ tác động nghiêm trọng nào không dựa trên việc Eric mô tả hành vi này là một " tính năng cực kỳ nguy hiểm ", nhưng mô hình này có thể gây ra mối đe dọa đáng tin cậy không?
IFoo.GetTypevà object.GetTypekhông giống nhau nên không có gì xấu đang xảy ra ở đây ngoại trừ phong cách kém. Chỉnh sửa: Nói chung GetTypesẽ được gọi trên một số đối tượng không được biết đến tại thời điểm biên dịch, trong hầu hết các trường hợp objectvà không phải một số giao diện tinh ranh. :)
GetType, cùng chữ ký. Điều đó không liên quan đến GetTypephương pháp mà là quan trọng. Bạn cũng có thể tạo một phương thức phiên bản công khai ẩn GetTypephương thức có liên quan , bằng cách sử dụng newtừ khóa bổ trợ. Lưu ý, nếu bạn có một phương thức chung như static Type Test<T>(T t) { return t.GetType(); }(không có ràng buộc T), thì nội dung như Test<IFoo>(new BadFoo())sẽ vẫn gọi GetTypephương thức gốc .