c#反射,如何获取泛型类型类属性

c#反射,如何获取泛型类型类属性,c#,generics,reflection,C#,Generics,Reflection,我有一个通用类型列表其中 public class Shift { [DisplayFormat(DataFormatString = "dd-MMM-yyy '(hours)'")] public DateTimeOffset Date { get; set; } [DisplayFormat(DataFormatString = "hh':'mm")] public TimeSpan TimeWorked { get;

我有一个通用类型
列表
其中

public class Shift
{
    [DisplayFormat(DataFormatString = "dd-MMM-yyy '(hours)'")]
    public DateTimeOffset Date { get; set; }

    [DisplayFormat(DataFormatString = "hh':'mm")]
    public TimeSpan TimeWorked { get; set; }
}
我正在尝试使用反射获取带有属性的日程表道具

var props = typeof(List<ShiftDayItem>).GetProperties();
var ShiftProperty = props.Last();
var props=typeof(List).GetProperties();
var ShiftProperty=props.Last();
但是ShiftProperty不包含任何属性,因此我无法访问Date或TimeWorked。 反射是否不知道这些,或者是否有其他方法可以让我获得这些属性? 谢谢

您需要更多代码:

Dim shifttprops= ShiftProperty.PropertyType.GetProperties()
For Each prop in shifttprops
   Dim attrs = prop.CustomAttributes
Next

注意使用
CustomAttributes
而不是
Attributes

我认为您误解了c#中的“属性”。
您的
Shift
类有两个属性:“Date”和“TimeWorked”。要获取关于这两个属性的信息,只需编写:
typeof(Shift).GetProperties()
。您正在调用
typeof(List).GetProperties()
,它将为您提供List类的属性:计数、容量等。。这些是完全不相关的。

我认为您希望从
Shift
属性中获取属性。为此,您需要从
列表中获取通用参数
T
。要做到这一点,你可以这样做

//从列表中获取泛型类型T,在您的示例中为Shift
//将“类型(列表)”替换为实际列表
类型listType=typeof(List).GenericTypeArguments[0];
要从类型
Shift
中获取所有属性,首先需要获取所有可以获取属性的属性

//从泛型类型T获取所有属性
PropertyInfo[]shiftProperties=listType.GetProperties();
现在您已经拥有了所有属性,可以获得属性了

//从每个属性获取所有属性,并将它们放在一个列表中(SelectMany)
IEnumerable attributes=shiftProperties.SelectMany(prop=>prop.GetCustomAttributes());
您从每个属性获得
IEnumerable
,这将导致
IEnumerable
,这不是我们想要的。我们使用的方法是
SelectMany
,它将每个IEnumerable都取下来,并将其展平为一个。 当你把所有的东西放在一起,你会得到这个

//从列表中获取泛型类型T,在您的示例中为Shift
//将“类型(列表)”替换为实际列表
类型listType=typeof(List).GenericTypeArguments[0];
//从泛型类型T获取所有属性
PropertyInfo[]shiftProperties=listType.GetProperties();
//从每个属性获取所有属性,并将它们放在一个列表中(SelectMany)
IEnumerable attributes=shiftProperties.SelectMany(prop=>prop.GetCustomAttributes());

Shift属性将是列表的最后一个属性,然后。您是指typeof(Shift).Get properties()?无法共享调试器的屏幕截图,但此对象的属性为空:(您能解释一下您试图用此解决的问题吗?反射可能不是您的最佳解决方案。此外,您的问题还不清楚:什么是
ShiftDayItem
?您试图获取的确切信息是什么?“反射没有意识到这些吗?”-是的,但您没有在正确的位置查找它们。您反映的是列表类型,而不是元素类型。此外,属性不保证按任何特定顺序返回,因此调用
.Last()是一个骗局。即使它现在工作了,它仍然可以在将来的任何时候中断而不改变源代码。最好通过属性的某个明确的方面来搜索。虽然问题不清楚,但你可能在正确的轨道上。但是你应该考虑举一个例子C,我实际上是从AOT中做类型检查的。她的程序集不知道Shift对象。我正在对generic typeof(T)进行检查,而T是List,但正在努力获取Shift的属性。我这样表述问题只是为了简化。感谢您,如果T是List,您可以通过调用var elemType=typeof(T)来获取Shift。GenericTypeArguments[0].见@AndrewToasterr的答案