【发布时间】:2017-04-29 06:05:29
【问题描述】:
这是我目前所拥有的,它工作正常。我只是想知道是否有更顺畅的方法:
public static PropertyInfo GetProperty<T, T2>(this Expression<Func<T, T2>> selectorExpression)
{
var memberExpression = selectorExpression.Body as MemberExpression;
if (memberExpression == null) throw new InvalidCastException();
return memberExpression.Member as PropertyInfo;
}
这是一个现在可以使用的示例函数。这会将列表中对象的所有选定值设置为某些值。
public static List<T> Set<T,T2>(this List<T> inList, decimal amount, Expression<Func<T, decimal>> valueSelector)
where T : class
{
var valueProperty = valueSelector.GetProperty();
foreach (var item in inList)
{
valueProperty.SetValue(item, amount);
}
return inList
}
然后我可以简单地这样做:
myList.Set(100, i => i.Value);
其中 Value 是 MyList 中对象的一些 Setter 属性。
现在我知道第二个函数是一个超级简单的例子。我实际上使用 GetProperty 来处理更复杂的东西,特别是我编写了一个函数,它根据其中的 Getter“权重”属性将 IEnumerable 中的值划分为选定的 setter 属性。
我要讨论的主要内容是我的 GetProperty 函数本身。有没有更好的方法来解决这个问题,还是我已经走在正确的轨道上了?有什么进一步的 null 检查或我应该做的事情吗?
【问题讨论】:
-
你为什么使用
Expression而不仅仅是一个普通的Func? -
为什么还要将其限制为十进制属性?
-
小数限制只是因为我在项目中使用它的所有时间都是小数,它是任意的。如何从 Func
获取属性? -
myList.ForEach( e => e.Value = 100 )
-
@SirRufo 请阅读我的最后一段。
标签: c# expression-trees anonymous-types c#-7.0