Có cách nào để buộc trình biên dịch giới hạn việc sử dụng thuộc tính tùy chỉnh chỉ được sử dụng trên các thuộc tính cụ thể như int, short, string (tất cả các kiểu nguyên thủy) không?
tương tự với AttributeUsageAttribute 's ValidOn- AttributeTargets điều tra.Cho phép một thuộc tính tùy chỉnh chỉ trên loại cụ thể
Trả lời
Không, bạn không thể, về cơ bản. Bạn có thể giới hạn số điện thoại này thành struct
và class
so với interface
, tức là về nó. Ngoài ra, bạn không thể thêm thuộc tính vào các loại bên ngoài mã của mình (ngoại trừ thông qua TypeDescriptor
, không giống nhau).
Bạn có thể tự viết mã để thực thi đúng cách sử dụng lớp thuộc tính của bạn, nhưng đó là nhiều như bạn có thể làm.
lưu ý phụ: một thuộc tính không có quyền truy cập vào bối cảnh riêng của nó, vì vậy bất kỳ kiểm tra ở đây sẽ phải ở trong mã phản chiếu mà truy vấn cho thuộc tính –
Tôi đã viết một bài kiểm tra đơn vị (NUnit) một khi được sử dụng Cecil xác minh thuộc tính "cho phép" của tôi. – Amy
Thời gian tốt ..... –
Bạn có thể chạy kiểm tra đơn vị này để kiểm tra.
Thứ nhất, tuyên bố thuộc tính validation PropertyType:
[AttributeUsage(AttributeTargets.Class)]
// [JetBrains.Annotations.BaseTypeRequired(typeof(Attribute))] uncomment if you use JetBrains.Annotations
public class PropertyTypeAttribute : Attribute
{
public Type[] Types { get; private set; }
public PropertyTypeAttribute(params Type[] types)
{
Types = types;
}
}
Tạo đơn vị kiểm tra:
[TestClass]
public class TestPropertyType
{
public static Type GetNullableUnderlying(Type nullableType)
{
return Nullable.GetUnderlyingType(nullableType) ?? nullableType;
}
[TestMethod]
public void Test_PropertyType()
{
var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes());
var allPropertyInfos = allTypes.SelectMany(a => a.GetProperties()).ToArray();
foreach (var propertyInfo in allPropertyInfos)
{
var propertyType = GetNullableUnderlying(propertyInfo.PropertyType);
foreach (var attribute in propertyInfo.GetCustomAttributes(true))
{
var attributes = attribute.GetType().GetCustomAttributes(true).OfType<PropertyTypeAttribute>();
foreach (var propertyTypeAttr in attributes)
if (!propertyTypeAttr.Types.Contains(propertyType))
throw new Exception(string.Format(
"Property '{0}.{1}' has invalid type: '{2}'. Allowed types for attribute '{3}': {4}",
propertyInfo.DeclaringType,
propertyInfo.Name,
propertyInfo.PropertyType,
attribute.GetType(),
string.Join(",", propertyTypeAttr.Types.Select(x => "'" + x.ToString() + "'"))));
}
}
}
}
thuộc tính của bạn, ví dụ như cho phép các loại tài sản duy nhất chữ số thập phân: mô hình
[AttributeUsage(AttributeTargets.Property)]
[PropertyType(typeof(decimal))]
public class PriceAttribute : Attribute
{
}
Ví dụ:
public class TestModel
{
[Price]
public decimal Price1 { get; set; } // ok
[Price]
public double Price2 { get; set; } // error
}
- 1. serializer tùy chỉnh cho chỉ một thuộc tính trong Json.NET
- 2. Đặt thuộc tính tùy chỉnh cho loại trường tùy chỉnh trong một loại nội dung tính năng
- 3. Đặt loại thuộc tính cho điều khiển tùy chỉnh WPF?
- 4. hạn chế loại thuộc tính của thuộc tính tùy chỉnh
- 5. Thuộc tính tùy chỉnh của loại mảng
- 6. Tạo thuộc tính có thể tùy chỉnh tùy chỉnh
- 7. Cách chỉ định trình chuyển đổi loại cụ thể cho một thuộc tính cụ thể bằng cách sử dụng AutoMapper
- 8. Làm cách nào để lưu trữ các loại Java, chỉ cho phép một số loại Java cụ thể?
- 9. Làm thế nào tôi có thể buộc PropertyGrid hiển thị hộp thoại tùy chỉnh cho một thuộc tính cụ thể?
- 10. Thuộc tính log4net tùy chỉnh PatternLayoutConverter (có chỉ mục)
- 11. Nhiều thuộc tính chỉ mục trên một loại?
- 12. Cho phép bất kỳ thuộc tính/thuộc tính nào trên máy chủ/usercontrol
- 13. Tôi có thể chỉ định dải ô có thuộc tính IntegerValidator trên ConfigurationSection tùy chỉnh không?
- 14. Tìm phần tử cụ thể dựa trên một thuộc tính
- 15. thuộc tính tùy chỉnh chỉ làm việc với element.getAttribute ("thuộc tính") nhưng không phải là "element.attribute"
- 16. Tùy chỉnh thuộc tính sản phẩm tùy chỉnh Magento
- 17. Chỉ có thể sử dụng thuộc tính Lỗi thời trên chỉ một getter hoặc một setter của một thuộc tính
- 18. PropertyGrid - Tên thuộc tính tùy chỉnh?
- 19. C# Thuộc tính tùy chỉnh từ Thuộc tính
- 20. Thuộc tính tùy chỉnh Jquery
- 21. jQuery: Tìm phần tử có thuộc tính tùy chỉnh cụ thể
- 22. C# Cách sắp xếp các thuộc tính trên một lớp bằng thuộc tính thuộc tính tùy chỉnh
- 23. Cho phép người dùng chỉ nhập các thẻ cụ thể
- 24. thuộc tính tùy chỉnh cho các cạnh trong BGL
- 25. wpf xác định thuộc tính tùy chỉnh cho kiểu
- 26. TinyMCE, cho phép thuộc tính dữ liệu
- 27. Thêm thuộc tính tùy chỉnh vào khung thực thể?
- 28. javascript - nhận thuộc tính tùy chỉnh dựa trên id
- 29. Chỉnh sửa mẫu tùy chỉnh: Bỏ qua thuộc tính thuộc tính
- 30. Thuộc tính tùy chỉnh trong UiBinder widget
Không, điều này là không thể. Nhất bạn có thể làm là viết một bài kiểm tra đơn vị sử dụng phản ánh và xác nhận việc sử dụng nó. Nhưng không có gì trong trình biên dịch sẽ làm điều này. – Amy
; bạn không thể thêm các thuộc tính vào các lớp ngoài tầm kiểm soát của bạn * anyway * - vì vậy bạn không thể thêm các thuộc tính vào 'int' hoặc' string'. Bạn có nghĩa là "chỉ cho các thuộc tính * là *' int' hoặc 'chuỗi'"? nếu vậy, câu trả lời vẫn là "không", p –
@MarcGravell ofcourse Tôi int, thuộc tính chuỗi và không thay đổi lớp int, Nhưng tôi sẽ chỉnh sửa. cảm ơn cho câu trả lời. – gdoron