有没有更简洁的方法来设置通用 类 的属性?
Is there a cleaner way to set Properties of Generic Classes?
这是我目前所拥有的,效果很好。我只是想知道是否有更顺畅的方法来解决它:
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);
其中值是 MyList 中的一些 Setter 属性 个对象。
现在我知道第二个函数是一个超级简单的例子。我 实际上 使用 GetProperty 来处理更复杂的东西,特别是我编写了一个函数,将 IEnumerable 中的值分配给选定的 setter 属性,基于在Getter'weight'属性里面。
我想讨论的主要内容是我的 GetProperty 函数本身。有没有更好的方法来解决这个问题,还是我已经在正确的轨道上了?任何类型的进一步空检查或我应该做的事情?
这对我有用:
public static PropertyInfo GetProperty<T>(this Expression<Func<T, decimal>> selectorExpression)
{
var memberExpression = selectorExpression.Body as MemberExpression;
if (memberExpression == null) throw new InvalidCastException();
return memberExpression.Member as PropertyInfo;
}
然后,使用这段代码,我将 42
写入控制台:
void Main()
{
Expression<Func<Foo, decimal>> exp = q => q.Bar;
var p = exp.GetProperty();
var f = new Foo();
p.SetValue(f, 42m);
Console.WriteLine(f.Bar);
}
public class Foo
{
public decimal Bar { get; set; }
}
仅仅因为这个问题被标记为 C#-7.0,我想提供一个具有 C#-7.0 特性的答案:
public static PropertyInfo GetProperty<TObject, TProperty>(
this Expression<Func<TObject, TProperty>> selectorExpression)
=> selectorExpression.Body is MemberExpression memberExpression
&& memberExpression.Member is PropertyInfo propertyInfo
? propertyInfo
: throw new InvalidCastException();
这是我目前所拥有的,效果很好。我只是想知道是否有更顺畅的方法来解决它:
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);
其中值是 MyList 中的一些 Setter 属性 个对象。
现在我知道第二个函数是一个超级简单的例子。我 实际上 使用 GetProperty 来处理更复杂的东西,特别是我编写了一个函数,将 IEnumerable 中的值分配给选定的 setter 属性,基于在Getter'weight'属性里面。
我想讨论的主要内容是我的 GetProperty 函数本身。有没有更好的方法来解决这个问题,还是我已经在正确的轨道上了?任何类型的进一步空检查或我应该做的事情?
这对我有用:
public static PropertyInfo GetProperty<T>(this Expression<Func<T, decimal>> selectorExpression)
{
var memberExpression = selectorExpression.Body as MemberExpression;
if (memberExpression == null) throw new InvalidCastException();
return memberExpression.Member as PropertyInfo;
}
然后,使用这段代码,我将 42
写入控制台:
void Main()
{
Expression<Func<Foo, decimal>> exp = q => q.Bar;
var p = exp.GetProperty();
var f = new Foo();
p.SetValue(f, 42m);
Console.WriteLine(f.Bar);
}
public class Foo
{
public decimal Bar { get; set; }
}
仅仅因为这个问题被标记为 C#-7.0,我想提供一个具有 C#-7.0 特性的答案:
public static PropertyInfo GetProperty<TObject, TProperty>(
this Expression<Func<TObject, TProperty>> selectorExpression)
=> selectorExpression.Body is MemberExpression memberExpression
&& memberExpression.Member is PropertyInfo propertyInfo
? propertyInfo
: throw new InvalidCastException();