GetType () có trả về kiểu dẫn xuất nhiều nhất khi được gọi từ lớp cơ sở không?


118

GetType () có trả về kiểu dẫn xuất nhiều nhất khi được gọi từ lớp cơ sở không?

Thí dụ:

public abstract class A
{
    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(this.GetType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them
}

Hay tôi chỉ nên tạo một phương thức trừu tượng mà các lớp dẫn xuất sẽ phải triển khai như sau?

public abstract class A
{
    protected abstract Type GetSubType();

    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(GetSubType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them

   protected Type GetSubType()
   {
       return GetType();
   }
}

10
tốt - bạn đã thử nó chưa?
BrokenGlass

2
@BrokenGlass bình thường tôi sẽ làm điều đó nhưng tôi không sử dụng máy tính ... chỉ sử dụng điện thoại của tôi để tạo bài đăng vì một giải pháp cho một vấn đề đang bắt đầu được hình thành và tôi rất tò mò muốn biết ngay bây giờ! = P
Feisty Mango

Câu trả lời:


133

GetType()sẽ trả về kiểu thực tế, được khởi tạo. Trong trường hợp của bạn, nếu bạn gọi GetType()một phiên bản của B, nó sẽ trả về typeof(B), ngay cả khi biến được đề cập được khai báo là một tham chiếu đến một A.

Không có lý do gì cho GetSubType()phương pháp của bạn .


Nó có mặc dù không? Tôi đang truyền một thể hiện của một đối tượng từ siêu lớp (trừu tượng) của nó, người nhận chỉ nhìn thấy siêu lớp. Nó không phải là nó sẽ luôn trả về những gì xử lý được xác định không phải là phiên bản? - hay tôi đang thiếu thứ gì đó?

Ah ha .. phần chênh lệch được sử dụng typeof (X) vs x.GetType () tôi nghĩ rằng

22

GetTypeluôn trả về kiểu đã thực sự được khởi tạo. tức là loại có nguồn gốc nhiều nhất. Điều này có nghĩa là GetSubTypehành vi của bạn giống như GetTypechính nó và do đó là không cần thiết.

Để lấy thông tin kiểu tĩnh của một số kiểu bạn có thể sử dụng typeof(MyClass).

Tuy nhiên, mã của bạn có một lỗi: không System.Attribute.GetCustomAttributestrả về .Attribute[]Type


7

GetType luôn trả về kiểu thực tế.

Lý do cho nó nằm sâu trong khuôn khổ .NETCLR , vì JIT và CLR sử dụng .GetTypephương thức để tạo đối tượng Kiểu trong bộ nhớ lưu thông tin về đối tượng và tất cả quyền truy cập vào đối tượng và biên dịch đều thông qua cá thể Kiểu này. .

Để biết thêm thông tin, hãy xem trong cuốn sách "CLR qua C #" của Microsoft Press.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.