C#反射获取泛型类型类属性:无法获取Shift类属性及特性
解决反射获取Shift类属性特性的问题
嗨,我来帮你理清这个问题~你现在的代码之所以拿不到Date和TimeWorked的特性,核心原因是你反射的目标错了!
你当前写的:
var props = typeof(List<ShiftDayItem>).GetProperties();
获取的是List<T>这个容器类本身的公共属性(比如Count、索引器Item这些),这些属性和你定义的Shift(或者ShiftDayItem?看起来你代码里有个小笔误)类完全没关系,自然找不到你要的DisplayFormat特性。
正确的做法是直接反射Shift类
你需要针对Shift(如果实际是ShiftDayItem就替换成这个类型)的Type来获取属性,而不是它所在的List容器。以下是完整的示例代码:
// 1. 获取Shift类的Type对象 var shiftType = typeof(Shift); // 2. 获取Shift类的所有公共属性 var shiftProperties = shiftType.GetProperties(); // 3. 找到Date属性并获取它的DisplayFormat特性 var dateProperty = shiftProperties.FirstOrDefault(p => p.Name == nameof(Shift.Date)); if (dateProperty != null) { var displayFormatAttr = dateProperty.GetCustomAttribute<DisplayFormatAttribute>(); if (displayFormatAttr != null) { // 现在可以访问特性的DataFormatString了 string dateFormat = displayFormatAttr.DataFormatString; Console.WriteLine(dateFormat); // 输出: dd-MMM-yyy '(hours)' } } // 4. 同理获取TimeWorked属性的特性 var timeWorkedProperty = shiftProperties.FirstOrDefault(p => p.Name == nameof(Shift.TimeWorked)); if (timeWorkedProperty != null) { var timeFormatAttr = timeWorkedProperty.GetCustomAttribute<DisplayFormatAttribute>(); if (timeFormatAttr != null) { string timeFormat = timeFormatAttr.DataFormatString; Console.WriteLine(timeFormat); // 输出: hh':'mm } }
额外提醒
如果你代码里的ShiftDayItem才是实际的排班类(而不是Shift),记得把上面代码里的typeof(Shift)替换成typeof(ShiftDayItem)就行,保持类型一致。
内容的提问来源于stack exchange,提问作者Elvis Skensberg
相关产品推荐
相关产品推荐

