我该如何解决这个lambda表达式外变量问题?我正在使用PropertyDescriptor和ICustomTypeDescriptor(仍然)尝试将WPFDataGrid绑定到对象,数据存储在字典中。因为如果你将一个字典对象列表传递给WPFDataGrid,它会自动根据字典的公共属性(Comparer、Count、Keys和Values)生成列,我的Person子类Dictionary,并实现了ICustomTypeDescriptor。ICustomTypeDescriptor定义返回PropertyDescriptorCollection的GetProperties方法。PropertyDescriptor是抽象的,因此您必须对其进行子类化,我想我有一个采用Func的构造函数和一个Action参数,该参数委托获取和设置字典中的值。然后我为字典中的每个键创建一个PersonPropertyDescriptor,如下所示:行动(o=>{这个[s]=o;}));propList.Add(描述符);问题是每个属性都有自己的Func和Action但它们都共享外部变量,所以尽管DataGrid自动生成了“ID”、“FirstName”、“LastName”、“Age”、“Gender”的列它们都设置为“性别”,这是foreach循环中s的最终静止值。如何确保每个委托都使用所需的字典键,即实例化Func/Action时s的值?太感谢了。这是我的其他想法,我只是在这里尝试这些不是“真正”的类……}}publicclassPerson:Dictionary,ICustomTypeDescriptor{privatestaticPropertyDescriptorCollection描述符;publicPerson(){this["ID"]="201203";this["FirstName"]="Bud";这个[“姓氏”]=“树”;这个[“年龄”]=99;这个[“性别”]=“男”;}//...其他ICustomTypeDescriptor成员...publicPropertyDescriptorCollectionGetProperties(){if(descriptors==null){varpropList=newList();foreach(stringsinthis.Keys){vardescriptor=newPersonPropertyDescriptor(s,newFunc(()=>{returnthis[s];}),newAction(o=>{this[s]=o;}));propList.Add(描述符);}descriptors=newPropertyDescriptorCollection(propList.ToArray());}返回描述符;}//...其他ICustomTypeDescriptor成员...}publicclassPersonPropertyDescriptor:Property描述符{privateFuncgetFunc;私有动作集动作;publicPersonPropertyDescriptor(stringname,FuncgetFunc,ActionsetAction):base(name,null){this.getFunc=getFunc;this.setAction=setAction;}//其他...PropertyDescriptor成员...publicoverrideobjectGetValue(objectcomponent){returngetFunc();}publicoverridevoidSetValue(objectcomponent,objectvalue){setAction(value);Marc的解决方案当然是正确的,但我想我会在下面详细说明原因,因为我们大多数人都知道,如果你在for或foreach语句中声明一个变量,它只存在于内容中,这使得它看起来像变量不是与在中声明的同一个变量这样的语句中的语句块相同,但这是不对的。为了更好地理解它,请使用以下for循环。然后我将重述while形式的“等效”循环。for(inti=0;i这在下面的while-form中起作用:(它与continue的行为不完全相同,但对于范围规则它是相同的){inti=0;while(i当“爆炸”这样,变量的作用域就变得更清晰了,你可以看到为什么它总是在你的程序中捕获相同的“s”值,以及为什么Marc的解决方案向你展示了变量的定位,以便每次都捕获一个唯一的变量。只是:foreach(stringsinthis.Keys){stringcopy=s;vardescriptor=newPersonPropertyDescriptor(copy,newFunc(()=>{returnthis[copy];}),newAction(o=>{this[copy]=o;}));propList.Add(描述符);}使用捕获的变量,声明它很重要。因此,通过在循环内声明捕获变量,每次迭代都会获得捕获类的不同实例(循环变量s在技术上是在循环外声明的)。在for循环中创建s的本地副本并使用它。for(stringsinthis.Keys){stringkey=s;//...}关于这个问题的一些其他想法,参见Closingovertheloopvariableconsideredharmful,partone以上是C#学习教程:HowIsolvedthisLambdaexpressionexternalvariableproblem?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
