- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经开发了一个 MVC 助手来生成显示和可编辑的表格(需要一个 jquery 插件来允许动态添加和删除行,并在可编辑表格中进行完整的回发)例如
@Htm.TableDisplayFor(m => m.MyCollection as ICollection)
与属性一起使用将在页脚中包含总计,添加用于查看和编辑链接的列,为复杂类型呈现超链接等。
[TableColumn(IncludeTotals = true)]
我即将在 CodeProject 上发布它,但在此之前,我想解决一个问题。帮助程序首先从表达式中获取 ModelMetadata
,检查它是否实现了 ICollection
,然后获取集合中的类型(请注意以下代码段来自 SO 上已接受的答案,但是如下所述,并不完全正确)
if (collection.GetType().IsGenericType)
{
Type type = collection.GetType().GetGenericArguments()[0]
该类型用于为表头(表中可能没有任何行)和表体中的每一行生成ModelMetadata
(以防某些项目是继承类型,它们具有额外的属性,否则会搞砸列布局)
foreach (var item in collection)
{
ModelMetadata itemMetadata = ModelMetadataProviders.Current
.GetMetadataForType(() => item, type);
我希望能够做的是使用 IEnumerable
而不是 ICollection
这样 .ToList()
就不需要调用 linq 表达式。
在大多数情况下,IEnumerable
工作正常,例如
IEnumerable items = MyCollection.Where(i => i....);
可以,因为 .GetGenericArguments()
返回一个只包含一种类型的数组。问题是某些查询的“.GetGenericArguments()”会返回 2 种或更多类型,而且似乎没有逻辑顺序。例如
IEnumerable items = MyCollection.OrderBy(i => i...);
返回 [0] 集合中的类型,以及 [1] 用于排序的类型。
在这种情况下 .GetGenericArguments()[0]
仍然有效,但是
MyCollection.Select(i => new AnotherItem()
{
ID = i.ID,
Name = 1.Name
}
返回 [0] 原始集合中的类型和 [1] AnotherItem
的类型
所以 .GetGenericArguments()[1]
是我需要为 AnotherItem
呈现表格的内容。
我的问题是,是否有可靠的方法使用条件语句来获取呈现表格所需的类型?
到目前为止,根据我的测试,使用 .GetGenericArguments().Last()
在所有情况下都有效,但使用 OrderBy()
时除外,因为排序键是最后一种类型.
到目前为止我尝试过的一些事情包括忽略值类型的类型(OrderBy()
经常是这种情况,但是 OrderBy()
查询可能会使用 string
(可以检查)或者更糟的是,一个重载 ==、< 和 > 运算符的类(在这种情况下我无法判断哪个是正确的类型),而且我一直无法找到一种方法来测试该集合是否实现了 IOrderedEnumerable
。
最佳答案
已解决(使用 Chris Sinclair 发表的评论)
private static Type GetCollectionType(IEnumerable collection)
{
Type type = collection.GetType();
if (type.IsGenericType)
{
Type[] types = type.GetGenericArguments();
if (types.Length == 1)
{
return types[0];
}
else
{
// Could be null if implements two IEnumerable
return type.GetInterfaces().Where(t => t.IsGenericType)
.Where(t => t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
.SingleOrDefault().GetGenericArguments()[0];
}
}
else if (collection.GetType().IsArray)
{
return type.GetElementType();
}
// TODO: Who knows, but its probably not suitable to render in a table
return null;
}
关于c# - 使用 IEnumerable GetGenericArguments 获取类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23667593/
我已经开发了一个 MVC 助手来生成显示和可编辑的表格(需要一个 jquery 插件来允许动态添加和删除行,并在可编辑表格中进行完整的回发)例如 @Htm.TableDisplayFor(m => m
Type.GenericTypeArguments 属性和 Type.GetGenericArguments() 方法有什么区别?他们总是返回相同的东西还是有不同的情况? 最佳答案 typeof(Li
.NETStandard 1.0 中“缺少”方法 System.Type.GetGenericArguments(),我认为 TypeInfo.GenericTypeArguments 是 的替代品G
为什么 .NET Framework 同时提供 System.Type.GenericTypeArguments 和 System.Type.GetGenericArguments() 两者都返回给定
我是一名优秀的程序员,十分优秀!