gpt4 book ai didi

c# - 如何迭代 List where T : MyClass

转载 作者:行者123 更新时间:2023-11-30 13:46:50 24 4
gpt4 key购买 nike

我有嵌套列表的实体:

public class Article : MyEntityBase
{
public Article()
{
Tags = new List<Tag>();
}

[MyAttribute]
public string Title { get; set; }

[MyAttribute]
public virtual List<Tag> Tags { get; set; }
}

public class Tag : EntityBase
{
public string Title { get; set; }
}

public abstract class MyEntityBase
{
public Guid Id { get; set; }
}

我还有收集所有 [MyAttribute] 的功能标记属性并对它们进行一些操作:

public function OperateWithAttributes(IEnumerable<PropertyInfo> properties)
{
foreach (var p in properties)
{
if (p.PropertyType == typeof(string))
{
// do something
}
else if (/* there are code that check property type is List<T> */)
{
/* there are code that iterate list */
}
}
}

问题:

  • 如何将属性类型与 List<T> 进行比较?
  • 如果我知道它是从 EntityBase 继承的,如何迭代列表?

附言

我正在使用 .NET 4.5

最佳答案

How to compare property type with List<T>?

正确地将某物识别为列表是……棘手的;特别是如果你想处理所有边缘情况(自定义 IList<Foo> 实现,或子类 List<T> 等)。许多框架代码检查“实现非通用 IList,并且具有非 object 索引器”:

    static Type GetListType(Type type)
{
if (type == null) return null;
if (!typeof(IList).IsAssignableFrom(type)) return null;

var indexer = type.GetProperty("Item", new[] { typeof(int) });
if (indexer == null || indexer.PropertyType == typeof(object))
return null;

return indexer.PropertyType;
}

How to iterate list if I know that it's inherited from EntityBase?

假设您的意思是项目 继承自EntityBase ,并且您已确定它是一个列表(来自上一个问题),那么最简单的选项是 IListforeach :

var itemType = GetListType(p.PropertyType);
if(itemType != null && itemType.IsSubclassOf(typeof(EntityBase)))
{
var list = (IList) p.GetValue(obj);
foreach(EntityBase item in list)
{
// ...
}
}

注意:如果您要获取值无论如何,您也可以反转它并使用is。使用 GetListType 测试之前 :

var value = p.GetValue(obj);
Type itemType;
if(value is IList && (itemType = GetListType(p.PropertyType) != null)
&& itemType.IsSubclassOf(typeof(EntityBase)))
{
var list = (IList)value;
foreach(EntityBase item in list)
{
// ...
}
}

关于c# - 如何迭代 List<T> where T : MyClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19513575/

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