为什么表达树比反射更安全?

Cha*_* Y. 15 .net reflection expression-trees

这个确定属性是否包含给定属性的最快方法问题的答案中,用户Darin Dimitrov假定表达式树比反射更安全.这是真的,如果是这样,为什么会这样呢?

And*_*rey 14

因为当您搜索字段时(如在该问题中),您使用字符串表示"Id".一旦它被改变,你的反射就会崩溃.

达林建议的是静态输入:

Expression<Func<Program, int>> expression = p => p.Id;
Run Code Online (Sandbox Code Playgroud)

你看到了吗?这很有趣,但C#4.0编译器并不是众所周知的特性:自动从lambda表达式构建表达式树并将其转换为Expression<T>.所以,再后来,你可以穿越它,并得到MemberInfoId.但它并不像反射那样普遍,因为你无法搜索string.

  • 并且它更适用于自动重构工具,因为它们知道它引用了某个属性而不是不透明的字符串. (6认同)

asa*_*yer 5

正如所述的问题是为什么表达树比反射更安全.

答案是他们都使用反思.

编辑澄清 - MemberInfo.GetCustomAttributes是一个反射调用.

http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.getcustomattributes(VS.71).aspx

  • 问题暗示表达式树和反射是两个独立的东西,我只是指出,无论你获得MemberInfo对象,它仍然使用反射.我试图澄清操作可能产生的任何混淆. (4认同)