C#-如何通过';输出';参数转换为lambda表达式

C#-如何通过';输出';参数转换为lambda表达式,c#,linq,lambda,out-parameters,C#,Linq,Lambda,Out Parameters,我有一个具有以下签名的方法: private PropertyInfo getPropertyForDBField(string dbField, out string prettyName) 在其中,我根据给定的dbField找到关联的值prettyName。然后,我想查找名称为prettyName的所有属性(如果有),因此我尝试执行以下操作: IEnumerable<PropertyInfo> matchingProperties = getLocalPropertie

我有一个具有以下签名的方法:

private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)
在其中,我根据给定的
dbField
找到关联的值
prettyName
。然后,我想查找名称为
prettyName
的所有属性(如果有),因此我尝试执行以下操作:

IEnumerable<PropertyInfo> matchingProperties =
    getLocalProperties().Where(prop =>
        prop.Name.Equals(prettyName)
    );
IEnumerable匹配属性=
getLocalProperties()。其中(prop=>
prop.Name.Equals(prettyName)
);
但是,这会产生以下错误:

无法在匿名方法、lambda表达式或查询表达式中使用ref或out参数“prettyName”

在我试图在
where
lambda参数中使用
prettyName
的方法中,肯定初始化了
prettyName
。如果无法将
prettyName
初始化为有效值,则返回
。这里有什么技巧可以让我在lambda表达式中使用
prettyName


编辑:如果重要的话,我将使用.NET 3.5。

正如编译器错误所示,不允许在lambda表达式中使用out或ref参数

为什么不用一份拷贝呢?反正lambda也不想对变量进行变异,所以我看不出有什么坏处

string prettyNameCopy = prettyName;
var matchingProperties = getLocalProperties()
                        .Where(prop => prop.Name == prettyNameCopy);

或者,您可以使用局部贯穿(评估适当的名称等),并在从方法返回之前分配
out
参数
prettyName
。如果方法中没有明显的分支,那么这可能会更具可读性。

只是为了澄清一下。可以在lambda中使用被调用方法的ref/out参数

若指定参数的类型,也可以使用ref或out。这意味着将prettyName作为参数发送给lambda

(prop, ref string prettyName) => prop.Name.Equals(prettyName);
Where子句只接受一个参数,即列表中的属性元素。这就是阻止您向lambda添加参数的原因

(prop, ref string prettyName) => prop.Name.Equals(prettyName);

我不想给人们留下这样的错误印象,即你不能在lambda中使用这些论点。您不能通过捕获来使用它们。

如何将您要输入到prettyName的值存储到另一个变量中,以便执行
prettyName=someval
然后在anon函数中使用
someval
?正如公认的答案所示,你在标题中所写的并不是你想要做的,请更改它……好吧,现在我觉得很傻。我正在研究如何使用
委托
或一些疯狂的方法来完成这项任务。谢谢干杯<代码>委托
不会有多大帮助,因为同样的限制也适用于匿名委托。向上投票。这正是我所需要的。李,由于某种原因,我不能让它工作。我使用的代码是IEnumerable matchingProperties=getLocalProperties()。其中((prop,ref string prettyName)=>prop.Name.Equals(prettyName))。。。但它在“ref”上给出了一个错误("无法在此作用域中声明名为“prettyName”的局部变量,因为它将赋予已在父级或当前作用域中使用的“prettyName”不同的含义。或者您是说您仍然必须将prettyName重新分配给其他字符串变量,但您可以通过引用或输出将其传入?是的,您必须将其命名为dif当然。当我写这个答案时,我使用了一些没有给出有意义名称的示例代码进行了测试。因此我可能对这两个代码进行了不同的命名。但是,我没有测试这是否会导致变量在某个点上发生神奇的变化。这就是为什么他们首先设置了限制。他们希望避免您导致变量变为m以后要灵活地更改,因为当您将一个参数传递给委托时,它实际上持有对该参数的引用。由于委托可以随时通过将其传递到其他地方或存储以供将来使用来调用,因此您的参数将比在其中声明的方法寿命更长。