Lambda"if"声明?

And*_*ewC 10 c# lambda

我有两个对象,我想将它们转换为dictionarys.我用toDictionary <>().

获取密钥的一个对象的lambda表达式是(i => i.name).对于另一个,它是(i => i.inner.name).在第二个中,i.name不存在.如果i.name没有,i.inner.name总是存在.

是否有一个lambda表达式可以用来组合这两个?基本上读作:

"如果i.name存在,则将id设置为i.name,否则将id设置为i.inner.name".

非常感谢.

更新

当我说"不存在"时,我的意思是对象实际上没有属性,而不是属性只是null.

Luk*_*keH 14

如果这些是两种不同的(引用)类型,那么您可以使用isas关键字测试它们:

i => {
         var x = i as TypeThatHasNameProperty;
         return (x != null) ? x.name : i.inner.name;
     }
Run Code Online (Sandbox Code Playgroud)

如果您无法测试特定类型,那么您可以使用反射来测试name属性本身:

i => {
         var pi = i.GetType().GetProperty("name");
         return (pi != null) ? pi.GetValue(i, null) : i.inner.name;
     }
Run Code Online (Sandbox Code Playgroud)

  • 在访问`Name`属性之前,是否需要将`i`转换为`TypeThatHasNameProperty`? (2认同)

Tho*_*mas 6

是的,条件运算符(“三元运算符”)执行您想要的操作:

(i => i.name != null ? i.name : i.inner.name)
Run Code Online (Sandbox Code Playgroud)

当然,假设您可以通过检查null.

编辑:在那种情况下,当然,Kirschstein 的回答更好。


Sek*_*hat 4

为什么不给每个对象一个ToDictionary自己的方法,因为在这种情况下它们显然有自己的行为。

如果您无法添加对象,因为您不拥有它们,您始终可以为它们编写扩展方法。

你有什么理由试图强迫它们进入一个“通用”功能?