- 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/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!