【发布时间】:2018-05-21 09:43:11
【问题描述】:
我有以下可能检索列表中的值:
使用反射:
foreach (var item in items) {
var property=item.Fields[fieldName].GetType().GetProperty("Id");
var value=property.GetValue(item.Fields[fieldName]);
if (value==searchValue) {
filtered.Add(item);
}
}
使用动态:
foreach (var item in items) {
dynamic itemProperty=item.Fields[fieldName];
if (itemProperty.Id==searchValue) {
filtered.Add(item);
}
}
两个循环的作用相同。他们通过 Field[fieldName] 过滤 IEnumerable(或 List),它可以是不同的类型,但都包含一个名为“Id”的 int 属性。
我想知道哪个性能更好。 另外:将其中一个更改为 LinQ-Query 会提高性能吗?
【问题讨论】:
-
dynamic也使用反射,但不像您在第一个示例中那样粗暴。所以我怀疑动态在这里会更快。当然,您也可以自己测量。 -
有一个更简单的方法来处理这种场景 - 添加一个
interface IHasId { int Id {get; } }并让你的类型实现它(因为隐式接口实现通常只是意味着添加: IHasId到每个).. . 然后foreach(IHasId item in items) { if (item.Id == searchValue) { ...} } -
你为什么不在一个足够大的集合上尝试一下呢?只需测量它,例如使用
StopWatch。并且记住不要做premature optimization。也可以看看stackoverflow.com/questions/4646786/…。
标签: c# performance linq dynamic reflection