Có thể không? Với sự phản ánh hay cách nào khác?Thay đổi các thuộc tính chỉ đọc với sự phản chiếu
Trả lời
Như đã nêu khác, nếu bạn cần làm điều đó, bạn đang phải đối mặt với một vấn đề thiết kế để bắt đầu. Bây giờ, nếu bạn muốn biết nếu nó có thể chỉ vì lợi ích của việc biết, hoặc nếu không có cách nào khác trên trái đất để làm điều đó, nó thực sự có thể, với sự giúp đỡ của một rất nhỏ helper library và một phương pháp mở rộng.
Xét đoạn mã sau:
class Person {
int age;
string name;
public int Age { get { return age; } }
public string Name { get { return name; } }
}
// ...
using Mono.Reflection;
using System.Reflection;
// ...
Person person = new Person (27, "jb");
PropertyInfo nameProperty = typeof (Person).GetProperty ("Name");
FieldInfo nameField = nameProperty.GetBackingField();
nameField.SetValue (person, "jbe");
Sử dụng mã này, bạn có thể nhận được sự ủng hộ lĩnh vực của một tài sản với tài sản chỉ, và chỉ định một giá trị mới cho lĩnh vực sao lưu. Bạn có thể đọc thêm chi tiết về số implementation.
Cũng lưu ý rằng nó chỉ hoạt động đối với tài sản đơn giản, chẳng hạn như:
public int Age { get { return age; } }
public string Name {
get { return name; }
set { name = value; }
}
public double Velocity { get; private set; }
Nếu bạn có các tính chất phức tạp với mã tùy chỉnh, resolver lĩnh vực sao lưu sẽ thất bại.
tùy thuộc vào thuộc tính. nếu đó là thuộc tính được tính toán - không, trừ khi bạn biết nó dựa trên cái gì. nếu đó chỉ là một người truy cập vào một trường riêng, thì bạn có thể cố gắng sửa đổi trường này. Tuy nhiên,
nói chung là một ý tưởng rất tồi, vì bạn có thể không biết tác dụng phụ nào sẽ gây ra.
PropertyInfo isReadOnly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance| BindingFlags.NonPublic);
//Remove the readonly property
isReadOnly.SetValue(param, false, null);
//.............put your code here.....
// Set readonly property
isReadOnly.SetValue(param, true, null);
Là một workaround rất bẩn để tự động tạo ra chỉ đọc thuộc tính:
class MyTestClass
{
public string MyProperty { get; }
public MyTestClass(string MyProperty)
{
this.MyProperty = MyProperty;
}
}
Bạn có thể thay đổi tự động tạo lĩnh vực sao lưu theo cách sau:
MyTestClass MyClass = new MyTestClass("Hello");
FieldInfo MyWriteableField = MyClass.GetType().GetRuntimeFields().Where(a => Regex.IsMatch(a.Name, $"\\A<{nameof(MyClass.MyProperty)}>k__BackingField\\Z")).FirstOrDefault();
MyWriteableField.SetValue(MyClass, "Another new value");
PS: khi bạn đang sử dụng phiên bản .NET < 4.6 bạn có thể phải thay đổi một số mã để hoạt động. Tận hưởng!
Một thay thế cho Simon Mattes trả lời sẽ là
Giả sử bạn có:
public class MyClass
{
public int MyNumber {get;}
}
Bạn có thể làm điều này nếu nó cho mục đích thử nghiệm:
var field = typeof(MyClass).GetField("<MyNumber>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(anIstanceOfMyClass, 3);
- 1. Không thể thay đổi trường chỉ đọc với sự phản chiếu
- 2. Thiết lập các thuộc tính với sự phản chiếu trên các lớp tĩnh
- 3. Sự kiện thay đổi thuộc tính javascript
- 4. Các trường hoặc thuộc tính chỉ đọc
- 5. Cài đặt chỉ đọc với thuộc tính JavaFx
- 6. Chuyển đổi thuộc tính chỉ đọc trong trường nhập
- 7. Phản chiếu có thực sự chậm không?
- 8. WCF DataContract serialization thuộc tính chỉ đọc?
- 9. Thiết lập thuộc tính chỉ đọc với loại vô danh
- 10. Thuộc tính & Thư viện phản chiếu cho C++?
- 11. Có mẫu để đăng ký thay đổi thuộc tính phân cấp với UI phản ứng không?
- 12. Hiệu suất phản chiếu - Tạo đại biểu (Thuộc tính C#)
- 13. Nant và thay đổi thuộc tính tệp (chỉ đọc để ghi)
- 14. Cách đặt giá trị thuộc tính thông qua tên thẻ thuộc tính bằng cách sử dụng sự phản chiếu?
- 15. Ghi đè thuộc tính chỉ đọc trừu tượng để đọc/ghi thuộc tính
- 16. Sự phản chiếu Scala với các kiểu tham số
- 17. Khởi tạo thuộc tính chỉ đọc
- 18. Đặt thuộc tính Nullable <> bằng cách phản chiếu
- 19. C# Đặt đối tượng Giá trị thuộc tính DateTime thông qua sự phản chiếu
- 20. C# xác định thuộc tính Nullable Loại DateTime khi sử dụng sự phản chiếu
- 21. Mocking thuộc tính chỉ đọc ảo với moq
- 22. loại thuộc tính hoặc lớp học sử dụng phản chiếu
- 23. Tôi có thể thay đổi trường thừa kế riêng chỉ đọc trong C# bằng cách sử dụng phản chiếu không?
- 24. Thuộc tính tự động VB.net - chỉ đọc?
- 25. Thay đổi thuộc tính từ trong Chỉ thị
- 26. jQuery - Sự kiện khi thuộc tính của nút thay đổi
- 27. Thay đổi thuộc tính href
- 28. Nhận các thuộc tính/phương thức riêng của lớp cơ sở với sự phản ánh
- 29. Sao chép thuộc tính NSString hoặc chỉ đọc?
- 30. Tại sao có thể thay đổi giá trị của một trường chỉ đọc chứ không phải của một const sử dụng sự phản chiếu?
Élodie: Có thể, nhưng * * KHÔNG LÀM IT ** !!! – Gabe
Bạn đang cố gắng thay đổi giá trị trả về của một thuộc tính chỉ với getter, hoặc giá trị của trường sao lưu chỉ đọc (như 'readonly int primitiveValue = 1;')? – Elisha
Hi Élodie, bạn có thể yêu cầu thêm thông tin hay chấp nhận câu trả lời không? –