You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:24:15