如何识别Selection factory的Select One/Select Many属性
判断Select One/Select Many属性的可行方案
基于类型特征的反射判断
常规场景下Select One对应单个值类型,Select Many对应集合/数组类型,你可以通过反射判断属性类型的特征做区分,需注意排除特殊的string类型(string实现了IEnumerable但属于单选值类型)。
示例代码(C#):// 判断是否为Select Many属性 private bool IsSelectMany(PropertyInfo propertyInfo) { if (propertyInfo.PropertyType == typeof(string)) return false; return typeof(IEnumerable).IsAssignableFrom(propertyInfo.PropertyType); }该方案无业务侵入性,无需修改现有属性定义即可直接接入你的Selection factory。
基于自定义特性的显式标记
如果存在特殊场景(比如部分单选属性也用集合类型承载值),可以自定义特性给属性做显式标记,反射时优先读取特性值,兼容性和准确性更高。
示例代码(C#):// 定义选择类型枚举 public enum SelectionType { SelectOne, SelectMany } // 自定义标记特性 [AttributeUsage(AttributeTargets.Property)] public class SelectionTypeAttribute : Attribute { public SelectionType SelectionType { get; } public SelectionTypeAttribute(SelectionType type) { SelectionType = type; } } // 业务属性上标记 public class DemoModel { [SelectionType(SelectionType.SelectOne)] public int DepartmentId { get; set; } [SelectionType(SelectionType.SelectMany)] public List<int> SelectedTagIds { get; set; } } // Selection factory中读取逻辑 public SelectionType GetPropertySelectionType(PropertyInfo propertyInfo) { var attr = propertyInfo.GetCustomAttribute<SelectionTypeAttribute>(); if (attr != null) return attr.SelectionType; // 没有标记时 fallback到类型判断逻辑 return IsSelectMany(propertyInfo) ? SelectionType.SelectMany : SelectionType.SelectOne; }基于UI控件元数据读取
如果你的Selection factory是和UI控件直接绑定的,可以直接读取控件本身的多选配置项(比如前端下拉控件的multiple属性、后端UI框架控件的AllowMultiple属性),直接和实际渲染的控件类型对齐,不需要依赖业务属性特征。
内容的提问来源于stack exchange,提问作者Ms1
相关产品推荐
相关产品推荐

