操作<T>和 Func<T,T> 不会保存对对象的更改



在我的代码中,我有一个lambda表达式形式的新项属性setter。它就像一样简单

( x ) => x.Property = y

我把它写到了一个Action<T>变量中,并且在需要的时候一直在使用它。

问题是,当我";打印";对象作为gui的输入发送到那个lambda,我发现该属性保持为null。

我试过调试它,在lambda表达式中,我可以看到对象的属性被设置为所需的值,但当我退出lambda时,属性又回到了null。出于某种原因,这就好像lambda对这个对象的副本而不是它的引用进行操作一样??我试着把它改写成delegate void ActionRef<T>( ref T item )(这是我在读了一些SO问题后想到的(,但效果完全一样。

最后,我尝试了Func<T,T>,不知何故,它再次返回了一个属性仍设置为null的对象。我甚至尝试设置一些默认类型属性(string、int、DateTime(,只是为了测试我的自定义类的对象是否有问题,但没有,在离开lambda后,这些属性也没有正确设置。

我真的不知道这是什么原因。我甚至写了一个简单的测试应用程序,可以做类似的事情,而且效果很好。这是我第一次遇到lambdas的问题。

我怀疑这里是否真的需要代码样本,但如果有人需要的话:

class A {
A ( Action<T> setter ) {
newItemPropertySetter = setter;
}
void InsertNewItem() {
…
T item = new T();
if ( newItemPropertySetter != null )
newItemPropertySetter( item );
…
}
}
class B {
…
… = new A( ( x ) => x.Property = y );
…
}

最后,我想到的最后一件事可能与这个奇怪的问题有关——T类是我在nHibernate中使用的ORM类。这仍然不能帮助我理解为什么我设置为某个值的属性突然被取消设置为null/default。


编辑:经过相当多的调试,我发现最后其他一些代码会立即用默认值覆盖该属性。很抱歉给你添麻烦。

这是一个猜测,因为您没有显示足够的代码,但我猜您没有接受"y";在B类中正确地闭合

最新更新