2013-04-23 11 views
9

Có thể thiết kế một lớp C# khi truy vấn nó thông qua phản xạ sẽ đánh dấu chính nó là IsValueType tích cực và IsClass dương?Có thể thiết kế một lớp C# khi truy vấn nó thông qua phản xạ sẽ đánh dấu chính nó là IsValueType tích cực và IsClass dương?

Hoặc thực tế chúng có đánh dấu lẫn nhau không?

Tôi biết rằng,

loại nguyên thủy Hầu hết sẽ trở lại (kể cả enums & cấu trúc):
IsValueType = true, IsClass = false.

Chuỗi hoặc bất kỳ lớp nào - tóm tắt quá .. return:
IsValueType = false, IsClass = true.

Giao diện trả:
IsValueType = false, IsClass = false

+1

trường hợp sử dụng của bạn là gì thực sự? – ken2k

+0

Chỉ cần xây dựng một số trình quản lý bền vững đơn giản cho các đối tượng để lưu vào một số loại tệp phẳng và tôi muốn nó bao gồm phạm vi loại rộng nhất. nhưng bất kể tôi luôn tự hỏi về nó :) –

+1

Chỉ cần đáp ứng các yêu cầu sau: ValueType: 'this.IsSubclassOf (RuntimeType.ValueType);', Class: '(((this.GetAttributeFlagsImpl() & TypeAttributes.Interface) == TypeAttributes.AutoLayout) &&! this.IsValueType); ' – sll

Trả lời

7

Có thể thiết kế một lớp C# khi truy vấn nó qua phản xạ sẽ đánh dấu chính nó như là IsValueType tích cực và tích cực IsClass ?

Chúng ta hãy nhìn vào những hiện thực: (!)

protected virtual bool IsValueTypeImpl() 
{ 
     return this.IsSubclassOf((Type) RuntimeType.ValueType); 
} 

public bool IsClass 
{ 
    [__DynamicallyInvokable] get 
    { 
    if ((this.GetAttributeFlagsImpl() & TypeAttributes.ClassSemanticsMask) == TypeAttributes.NotPublic) 
     return !this.IsValueType; 
    else 
     return false; 
    } 
} 

Như bạn thấy, IsValueTypeImpl() (được gọi bằng IsValueType tài sản) phụ thuộc vào thừa kếIsClassphụ thuộc vàoIsValueType .

Tiếp theo, this description of ValueType tuyên bố rằng không thể kế thừa trực tiếp từ ValueType.

Vì vậy, câu trả lời là không , bạn không thể tạo kiểu đó sẽ IsClassIsValueType cùng lúc

+1

Phương pháp đầu tiên được đánh dấu là ảo, ngụ ý có thể có các cách triển khai khác nhau của phương pháp này. –

+0

@ BuhBuh nhưng phương pháp thứ hai không phải là ảo đảm bảo nó không bao giờ có thể xảy ra .. –

+0

@BuhBuh nó có thể thay đổi không? chắc chắn, tất cả trong tất cả, đó là mã khung nội bộ, nó có thể thay đổi, nhưng tôi thực sự nghi ngờ rằng hành vi công khai có thể thay đổi, rất nhiều mã của bên thứ ba có thể phụ thuộc vào nó. –

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