Linq參數類型分析
Linq有很多值得學習的地方,這里我們主要介紹Linq參數類型,包括介紹通過Linq進行強類型反射等方面。
大家都知道Linq引入了標準查詢操作符,從而使查詢成為C#語言中最重要的概念。但不知您是否意識到,Linq還可用于查詢外的其他用途。下面我將***探討Linq用于查詢外的其他領域。
反射問題:遠離類型安全錯誤
至少就我自己而言,使用C#這種類型安全語言時,每當按下Ctrl+Shift+B(或Shift+F6)鍵進行編譯時,會有一種輕松和放心的感覺。我知道,由于使用錯誤的類型而產生的怪異且難于調試的運行時錯誤,以及像“方法缺失”這種提示幾乎從未出現。但是使用反射時,如果我不小心,就會出現臭名昭著的TargetInvocationException和一些NullReferenceException之類的異常。下面正是我所遇到的:
- MethodInfo method = typeof(Mock).GetMethod("PublicMethodParameters",
newType[]{ typeof(string), typeof(int) }));
如果對Mock類應用重構以便重命名該方法,會發生什么情況呢?如果Linq參數類型發生更改,會發生什么情況呢?毫無疑問,會發生運行時異常!如果采用一個使用大量反射的插入式靈活框架,這決不是一個小問題。由于害怕出錯而不敢應用重構(或者使其代價昂貴)必然會限制您改進設計和完善代碼的能力。那么,試著替換魔力字符串(magic strings)和松散類型的Type數組將會如何呢?
- MethodInfo info = Reflector.Method<Mock, string,
int>((x, y, z) => x.PublicMethodParameters(y, z));
通過Linq進行強類型反射
其工作原理是作為參數傳遞的λ表達式(就像前一版本.NET中的委托一樣)不一定要執行。上面的代碼基本上構造了一個可以調用類型上給定方法的λ表達式。聲明方法的目標類型的類型就是Method<> static generic方法的***個類型參數。您可指定的可選Linq參數類型將是您要調用的方法的Linq參數類型(如果存在)。如果我想獲得無參數方法的MethodInfo,則表達式將是:
- MethodInfo info = Reflector.Method<Mock>(x => x.PublicMethodNoParameters());
這比您以前見到的任何λ表達式都典型。在λ表達式中,如果您需要傳遞附加參數,則必須將所有內容放到括號中(上例中的x、y和z)。用于屬性和字段的類型映射功能是相同的:
- PropertyInfo property = Reflector.Property<Mock>(x => x.PublicProperty);
- FieldInfo field = Reflector.Field<Mock>(x => x.PublicField);
【編輯推薦】