gpt4 book ai didi

c# - 如何识别List是否为实现特定接口(interface)的T列表

转载 作者:行者123 更新时间:2023-11-30 20:47:34 25 4
gpt4 key购买 nike

好吧,我有一个类包含 List 类型的多个属性.

有些列表只是简单的类型,例如 string , int ETC。但有些是自定义类型的列表,例如正片、预告片、艺术作品等。

public class Movie : IMedia
{
public List<Feature> Features;
public List<Artwork> Artwork;
public List<string> Genres;
}

所有自定义类型(以及 Movie 类本身)都实现接口(interface) IMedia .

使用反射,我想遍历 Movie 属性并对类型为 List<IMedia> 的那些做一些事情- 但问题就在这里;因为显然我不能只使用 is List<IMedia>当还想将属性指定为特定类型时,如 List<Feature> .

你们建议我如何识别这些类型?

扩展List<T>本身还是完全不同的东西?

最佳答案

假设您实际上是在使用属性(这是问题中提到的内容)而不是私有(private)字段(这是您问题中的类正在使用的内容) ,你可以这样做:

var movie = new Movie() { ... };

foreach (var prop in typeof(Movie).GetProperties())
{
if (prop.PropertyType.IsGenericType &&
prop.PropertyType.GetGenericTypeDefinition() == typeof (List<>))
{
/* Get the generic type parameter of the List<> we're working with: */
Type genericArg = prop.PropertyType.GetGenericArguments()[0];

/* If this is a List of something derived from IMedia: */
if (typeof(IMedia).IsAssignableFrom(genericArg))
{
var enumerable = (IEnumerable)prop.GetValue(movie);

List<IMedia> media =
enumerable != null ?
enumerable.Cast<IMedia>().ToList() : null;

// where DoSomething takes a List<IMedia>
DoSomething(media);
}
}
}

关于c# - 如何识别List<T>是否为实现特定接口(interface)的T列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25710066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com