2012-01-19 91 views
5

Nếu tôi có một thể hiện của một đối tượng, làm thế nào để kiểm tra xem nó có được đọc không?Kiểm tra xem một thể hiện của một đối tượng là chỉ đọc

tôi đã lùng sục qua System.Type và rằng rất nhiều IsXxxx()GetXxxx() loại chức năng nhưng không có IsReadOnly(), IsWriteable(), GetReadWriteProperty(), hoặc bất cứ điều gì dọc theo những đường. Tôi đoán một cái gì đó như myObj.GetType().IsReadOnly() sẽ là quá dễ dàng, và lớp Object không có gì hữu ích trong nó ngoài GetType().

Khi tôi google câu hỏi này, tất cả những gì tôi nhận được là cách sử dụng từ khóa chỉ đọc. Tôi nghĩ đến việc sử dụng Reflection và GetProperty() nhưng đây là một lớp cơ sở tồn tại trong một List <>, tôi sẽ cần thể hiện của đối tượng này là một thuộc tính đơn độc trong một đối tượng khác để tôi làm điều này. Tôi sẽ làm như vậy. suy nghĩ.

Bất kỳ ý tưởng nào?

+0

Guess Tôi cần phải tinh chỉnh thuật ngữ tìm kiếm của tôi tốt hơn thời gian tiếp theo, tôi tin rằng câu hỏi này có thể một bản sao của: http://stackoverflow.com/questions/481883/how-do-i-check-if-a-class-is-readonly-in-c –

+1

Bạn có thể cung cấp ví dụ về một đối tượng mà bạn cân nhắc được chỉ đọc? Ở cấp độ đối tượng, không có khái niệm nào được xác định. Các trường có thể hoặc không thể đọc được, và các thuộc tính có thể hoặc không có bộ công khai, và nó có thể hoặc không được đánh dấu '[ImmutableObject (true)]' - nhưng ... ít nhất 2 trong số đó * không thực sự làm cho nó không thay đổi * và thứ ba (các trường) không bắt buộc hoặc quá phổ biến (vì các trường sẽ là riêng tư) –

+0

@Marc Gravell: PropertyInfo cho một kiểu cho một CanRead và CanWrite, tôi đang tìm cách để có được những người trên bất kỳ đối tượng nhất định nào. –

Trả lời

5

Không có khái niệm nào như đối tượng là chỉ đọc. Biến số có thể chỉ đọc, nhưng đó là một vấn đề khác. Ví dụ:

class Foo 
{ 
    private readonly StringBuilder readOnlyBuilder; 
    private StringBuilder writableBuilder; 

    public Foo() 
    { 
     readOnlyBuilder = new StringBuilder(); 
     writableBuilder = readOnlyBuilder; 
    } 
} 

Ở đây chỉ có một đối tượng StringBuilder, nhưng hai trường - một trường chỉ đọc và một trường có thể ghi.

Nếu bạn đang hỏi liệu một loại là không thay đổi (ví dụ string là bất biến, StringBuilder không) mà là một câu hỏi thornier ... có rất nhiều khác nhau loại về tính bất biến. Xem Eric Lippert's blog post on the matter để biết thêm chi tiết.

+0

@Vijay Eric đã đăng, với ý định của mình để điều tra - Tôi nghĩ rằng nên được khá dứt khoát; cũng - nếu bạn yêu cầu mọi người nhìn vào một cái gì đó (mà là một chút của một áp đặt), ít nhất là cụm từ nó như là một ưu tiên hơn là một yêu cầu/yêu cầu –

+0

@Vijay: Tôi không phải là nhân viên của Microsoft, hoặc trên Đội ngũ C# theo bất kỳ cách nào. Tôi đã đăng một câu trả lời mặc dù - Tôi khá chắc chắn nó * là * một lỗi, và có một cách để kích động hành vi đặc biệt khó chịu. Tôi đồng ý với Marc mặc dù, "sự chú ý của bạn là cần thiết" và "xin làm cho mình có sẵn" là khá giống như nhu cầu hơn là thực sự kêu gọi. –

2

Jon Skeet là đúng (tất nhiên), không có điều nào như một đối tượng chỉ đọc trong C#. Tuy nhiên, một số khuôn khổ, chẳng hạn như WPF có khái niệm riêng của họ về các đối tượng chỉ đọc. WPF có freezables, các đối tượng có thể được thực hiện bất biến trong thời gian chạy, bạn có thể kiểm tra xem một freezable có bị đóng băng thông qua IsFrozen hay không.

3

Nếu bạn muốn kiểm tra cho các lĩnh vực ReadOnly, Sử dụng IsInitOnly tài sản trên lớp FieldInfo

http://msdn.microsoft.com/en-us/library/system.reflection.fieldinfo.isinitonly.aspx

//Get the Type and FieldInfo. 
Type myType = typeof(myReadOnlyfield); 
FieldInfo myFieldInfo = myType.GetField("ReadOnlyfield", 
    BindingFlags.Public | BindingFlags.Instance); 

//Check if the field is read only 
bool readOnly = myFieldInfo.IsInitOnly; 
Các vấn đề liên quan