簡體   English   中英

擴展方法和接口

[英]Extension Methods & Interfaces

我的所有類都實現了一個接口IPrettyPrint。 使用擴展方法,我可以將一個PrettyPrint方法添加到一個雙重例如( List<T> ,...)但是有任何可能性,雙重支持IPrettyPrint嗎? 任何喜歡使用PrettyPrint方法的人都只能依賴IPrettyPrint。

不,除非您使用允許“鴨子打字”的庫。 即便如此,如果方法僅在擴展方法中實現,我認為你很難。

不要被擴展方法所迷惑 - 你沒有向類型本身添加任何東西,它們只提供“語法糖”,然后由編譯器解釋。

擴展方法是編譯器功能,而不是運行時功能 - 它們模擬您向Type添加方法,但如果您反編譯代碼,您將看到它實際上沒有做任何此類事情(.NET使用靜態/關閉type-system,所以實際向類型添加方法的唯一方法是從類型繼承並將方法添加到類型中)

因此,從技術上講, double永遠不支持IPrettyPrint - 編譯器只是假裝它。

可以使用反射模擬鴨子類型 - 如果類型支持操作(即,具有您正在尋找的方法),那么它隱含地是該界面(即使您從未這樣做過),您應該調用它。 否則,它沒有!

問題是,C#反射有點慢,在大多數情況下都會浪費你的時間。 示例代碼如下:

public static object To(this string value, Type t) {
  object obj;

  // This is evil, I know, but is the most useful way to extend this method
  // without having an interface.
  try {
    MethodInfo method = t.GetMethod("Parse", BindingFlags.Static | BindingFlags.Public,
      null, new Type[] { typeof(string) }, null);
    Preconditions.Check(method.ReturnType == t, "The return type doesn't match!");
    obj = method.Invoke(null, new object[]{value});
  } catch (Exception e) {
    throw new CoercionException("I can't coerce " + value + " into a " + t.Name + "!", e);
  }
  return obj;
}

對於那些喜歡統計數據的人來說,當需要反射時,方法的查找幾乎為零。 但是,調用方法:

obj = method.Invoke(null, new object[]{value});

是一個性能需求大約需要4-5毫秒執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM