Vì vậy, trong trường hợp của tôi, tôi đang khám phá cấu trúc của một lớp bằng cách sử dụng sự phản chiếu. Tôi cần để có thể tìm hiểu xem một tài sản là một tài sản tự động thực hiện bởi các đối tượng PropertyInfo. Tôi cho rằng API phản chiếu không trưng ra chức năng như vậy bởi vì các thuộc tính tự động phụ thuộc C#, nhưng có cách giải quyết nào để lấy thông tin này không?Cách tìm hiểu xem thuộc tính có thuộc tính được tự động triển khai có phản ánh không?
18
A
Trả lời
16
Bạn có thể kiểm tra xem phương thức get
hoặc set
có được đánh dấu bằng thuộc tính CompilerGenerated
hay không. Sau đó, bạn có thể kết hợp điều đó với tìm kiếm trường riêng tư được đánh dấu bằng thuộc tính CompilerGenerated
có chứa tên thuộc tính và chuỗi "BackingField"
.
lẽ:
public static bool MightBeCouldBeMaybeAutoGeneratedInstanceProperty(
this PropertyInfo info
) {
bool mightBe = info.GetGetMethod()
.GetCustomAttributes(
typeof(CompilerGeneratedAttribute),
true
)
.Any();
if (!mightBe) {
return false;
}
bool maybe = info.DeclaringType
.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Where(f => f.Name.Contains(info.Name))
.Where(f => f.Name.Contains("BackingField"))
.Where(
f => f.GetCustomAttributes(
typeof(CompilerGeneratedAttribute),
true
).Any()
)
.Any();
return maybe;
}
Nó không đánh lừa bằng chứng, khá giòn và có lẽ không cầm tay, nói, Mono.
7
này nên làm:
public static bool IsAutoProperty(this PropertyInfo prop)
{
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
Lý do được rằng để tự động tính các Name
tài sản của sự ủng hộ FieldInfo
sẽ trông như thế:
<PropertName>k__BackingField
Kể từ khi nhân vật <
và >
sẽ không xuất hiện cho các trường thông thường, một trường có loại điểm đặt tên đó vào trường sao lưu của thuộc tính tự động. Như Jason nói, nó vẫn giòn.
Hoặc để làm cho nó một chút nhanh hơn,
public static bool IsAutoProperty(this PropertyInfo prop)
{
if (!prop.CanWrite || !prop.CanRead)
return false;
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
Các vấn đề liên quan
- 1. Thuộc tính tự động triển khai có hỗ trợ các thuộc tính không?
- 2. Thuộc tính có thể được đặt chỉ trên Setter của thuộc tính được tự động triển khai không?
- 3. Thuộc tính được triển khai tự động C#
- 4. Tìm hiểu xem một thuộc tính có được khai báo ảo
- 5. Xác định xem thuộc tính phản ánh có thể được gán không
- 6. Phản ánh - lấy tên thuộc tính
- 7. C# có được tự động triển khai các thuộc tính tĩnh an toàn không?
- 8. cách bạn có thể tìm hiểu xem NSObject có thuộc tính nhất định không?
- 9. Xác định xem thuộc tính có phải là loại mảng không bằng cách phản ánh
- 10. Java có thuộc tính tự động không?
- 11. Hộp thuộc tính CSS-phản ánh tính tương thích?
- 12. Thuộc tính phụ thuộc được triển khai như thế nào?
- 13. Thêm thuộc tính được tự động triển khai vào lớp bằng cách sử dụng Roslyn
- 14. Thuộc tính tự động triển khai có tập hợp riêng không?
- 15. cách tìm hiểu xem thuộc tính có tồn tại hay không trong XSL
- 16. Làm thế nào để nói phản ánh nếu một thuộc tính có công khai Setter
- 17. Có thuộc tính bean bean được làm mới tự động từ các tệp thuộc tính
- 18. Tìm phương pháp mà có thuộc tính tùy chỉnh sử dụng phản ánh
- 19. Tôi có nên sử dụng từ khóa tự (thuộc tính) trong quá trình triển khai không?
- 20. Nhận phản ánh giá trị của thuộc tính có getter có giá trị tùy chọn
- 21. Ở đâu/biến riêng tư trong thuộc tính được tự động triển khai là gì?
- 22. Theo dõi cuộc gọi đến các thuộc tính được tự động triển khai
- 23. Có thể truy cập các trường sao lưu sau các thuộc tính được tự động triển khai không?
- 24. C# Phản ánh lấy trường hoặc thuộc tính theo tên
- 25. Cách nhận thuộc tính có thuộc tính DataMemberAttribute với tên được chỉ định?
- 26. Phản ánh trên tất cả các thuộc tính của giao diện, bao gồm cả các thuộc tính được kế thừa?
- 27. không có thuộc tính
- 28. Thuộc tính Java có bị phản đối hiệu quả không?
- 29. Thuộc tính PythonError: Đối tượng không có thuộc tính
- 30. C# - Giá trị thuộc tính đệ quy/phản ánh
Thanks a lot Jason, Reflector nói với tôi như vậy trong khi chờ đợi :) nên đã nghĩ về nó trước đó. – Zoki
@ 3o4eTo: Chỉ cần được cảnh báo rằng điều này không đánh lừa bằng chứng, giòn và có thể không di chuyển đến Mono. – jason
Cũng chăm sóc ngoại lệ khi không có người khởi hành trên tài sản. – nawfal