【发布时间】:2018-10-29 13:44:40
【问题描述】:
我有以下问题。我必须遍历类的所有属性来配置一些构建器。一个类有很多属性,所以代码比较繁琐。它看起来像这样:
var b = builder<MyTypeWith1000Properties>
.WithProperty(x=>x.Property1)
.WithProperty(x=>x.Property2)
...
.WithProperty(x=>x.Property1000);
代码在很多地方重复了很多不同的类型,不仅是 MyTypeWith1000Properties。我正在考虑创建一些扩展,如下所示:
var b = builder<MyTypeWith1000Properties>
.WithAllProperties();
然后在 WithAllProperties 中,我可以使用反射迭代类型属性,如下所示:
public static IDataExtractor<T> WithAllProperties(this IDataExtractor<T> extractor)
{
var properties = typeof(T).GetProperties();
foreach (var property in properties)
{
extractor = extractor.WithProperty(/*the problem is here/*);
}
return extractor;
}
如何将循环中的属性变量转换为对应的表达式
Expression<Func<TRow, TValue>> propertyExpression
这是 WithProperty 所期望的
【问题讨论】:
-
看看
MemberExpression类。 -
你似乎是从一个奇怪的角度来解决这个问题。你到底想做什么?我不明白为什么要制作那种可能以指数方式迭代的过滤器。
-
我正在尝试简化代码 - 想象一下将这个构建器用于具有很多属性的不同类(为什么有这么多属性是另一回事)。您需要多次复制粘贴 WithProperty,然后将 lambda 更改为指向不同的属性。我不知道您所说的“过滤”是什么意思,以及为什么它会以指数方式迭代。
-
MyTypeWith100Properties有什么特别之处,还是只是一个普通的类,有字段和属性?你只关心属性吗?
标签: c# lambda reflection expression