如果您试图就地改变对象,您可以通过使用如下扩展方法以稍微更好的语法“伪造它”:
public delegate void Mutator<T>(ref T arg) where T : struct;
public static void FindAndMutate<T>(
this IList<T> self,
Predicate<T> predicate,
Mutator<T> mutator) where T : struct
{
if (self == null) { throw new ArgumentNullException("self"); }
if (predicate == null) { throw new ArgumentNullException("predicate"); }
if (mutator == null) { throw new ArgumentNullException("mutator"); }
for (int i = 0; i < self.Count; ++i) {
var value = self[i];
if (predicate(value)) {
mutator(ref value);
self[i] = value;
}
}
}
用法如下所示:
struct AStruct
{
public string String;
public int Int;
}
var list = new[] {
new AStruct() { String = "hello", Int = 0},
new AStruct() { String = "world", Int = 1}
};
list.FindAndMutate(i => i.Int == 0, (ref AStruct i) => i.String = "goodbye");
这显然不是一个完美的解决方案,并且确实涉及在扩展方法内部复制结构。
真的,如果您需要引用语义,您应该使用引用类型而不是值类型。