Linq参数类型分析

开发 后端
这里介绍您可指定的可选Linq参数类型将是您要调用的方法的Linq参数类型(如果存在),如果我想获得无参数方法的MethodInfo。

Linq有很多值得学习的地方,这里我们主要介绍Linq参数类型,包括介绍通过Linq进行强类型反射等方面。

大家都知道Linq引入了标准查询操作符,从而使查询成为C#语言中最重要的概念。但不知您是否意识到,Linq还可用于查询外的其他用途。下面我将***探讨Linq用于查询外的其他领域。

反射问题:远离类型安全错误

至少就我自己而言,使用C#这种类型安全语言时,每当按下Ctrl+Shift+B(或Shift+F6)键进行编译时,会有一种轻松和放心的感觉。我知道,由于使用错误的类型而产生的怪异且难于调试的运行时错误,以及像“方法缺失”这种提示几乎从未出现。但是使用反射时,如果我不小心,就会出现臭名昭著的TargetInvocationException和一些NullReferenceException之类的异常。下面正是我所遇到的:

  1. MethodInfo method = typeof(Mock).GetMethod("PublicMethodParameters",
    newType[]{ typeof(string), typeof(int) })); 

如果对Mock类应用重构以便重命名该方法,会发生什么情况呢?如果Linq参数类型发生更改,会发生什么情况呢?毫无疑问,会发生运行时异常!如果采用一个使用大量反射的插入式灵活框架,这决不是一个小问题。由于害怕出错而不敢应用重构(或者使其代价昂贵)必然会限制您改进设计和完善代码的能力。那么,试着替换魔力字符串(magic strings)和松散类型的Type数组将会如何呢?

  1. MethodInfo info = Reflector.Method<Mock, string, 
    int
    >((x, y, z) => x.PublicMethodParameters(y, z)); 

通过Linq进行强类型反射

其工作原理是作为参数传递的λ表达式(就像前一版本.NET中的委托一样)不一定要执行。上面的代码基本上构造了一个可以调用类型上给定方法的λ表达式。声明方法的目标类型的类型就是Method<> static generic方法的***个类型参数。您可指定的可选Linq参数类型将是您要调用的方法的Linq参数类型(如果存在)。如果我想获得无参数方法的MethodInfo,则表达式将是:

  1. MethodInfo info = Reflector.Method<Mock>(x => x.PublicMethodNoParameters()); 

这比您以前见到的任何λ表达式都典型。在λ表达式中,如果您需要传递附加参数,则必须将所有内容放到括号中(上例中的x、y和z)。用于属性和字段的类型映射功能是相同的:

  1. PropertyInfo property = Reflector.Property<Mock>(x => x.PublicProperty);  
  2. FieldInfo field = Reflector.Field<Mock>(x => x.PublicField); 

【编辑推荐】

  1. LINQ to SQL Table浅谈
  2. Linq语句问题的解决方法
  3. Ling to sql更新实体概述
  4. Linq实体继承简单描述
  5. Linq Library概述
责任编辑:佚名 来源: IT168
相关推荐

2009-09-10 14:21:58

LINQ匿名类型

2009-09-10 14:37:57

LINQ匿名类型

2009-09-14 15:50:52

Linq匿名委托类型

2009-09-07 16:44:28

Linq String

2009-09-15 15:09:50

Linq本质

2009-09-15 10:46:04

LINQ to SQL

2009-09-09 17:02:05

LINQ Expres

2009-09-09 18:03:47

LINQ to SQL

2009-09-08 14:56:55

强类型DataContLinq to SQL

2009-09-17 11:35:40

Linq匿名类型

2009-09-11 10:16:07

Linq匿名类型

2009-09-09 11:07:52

LINQ to SQL

2009-09-14 10:09:26

LINQ查询结果

2009-09-08 13:16:01

Linq to SQL

2009-09-16 15:41:45

LINQ查询XML文档

2009-09-16 10:48:32

LINQ查询操作

2009-09-16 17:41:56

Linq延时执行

2009-09-14 18:53:27

LINQ查询

2009-09-18 16:46:15

LINQ查询句法

2009-09-17 11:29:50

Linq扩展方法
点赞
收藏

51CTO技术栈公众号