簡體   English   中英

為泛型類型編寫擴展方法

[英]Write an extension method for generic type

我需要編寫一個擴展方法來替換字符串和StringBuilder中的char。 我可以編寫兩種擴展方法,例如:

public static string ReplaceChar(this string value, string charToReplace)
{
    return value.Replace(charToReplace, "_");
}

public static StringBuilder ReplaceChar(this StringBuilder value, string charToReplace)
{
    return new StringBuilder (value.ToString().Replace(charToReplace, "_"));
}

但我不知道是否有可能編寫如下通用方法:

public static T ReplaceChar<T>(this T value, string charToReplace)
{
    return new T(value.ToString().Replace(charToReplace, "_"));
}

在這種情況下,我有一個錯誤:T沒有new()構造函數

這是一個非常糟糕的主意。 您想以相同的方式使用不可變類型和可變類型。 StringBuilder的唯一作用是為字符串操作提供更好的速度性能。 您的StringBuilder擴展方法非常糟糕且無用。

  • 糟糕,因為它創建了2個對象,並且違反了StringBuilder哲學。
  • 沒有用,因為StringBuilder已經有一個Replace方法

您的方法有兩個問題。 給您一個錯誤的是,如果您想new它,則T需要具有new()約束:

public static T ReplaceChar<T>(this T value, string charToReplace)
     where T : new()

第二個問題是約束僅表示其具有不帶參數的構造函數,因此無法調用帶參數的構造函數...因此:

return new T(value.ToString().Replace(charToReplace, "_"));

只是不可能,這是泛型的局限性(您不能限制new(string)或任何類似的約束)。 可能是一個不錯的功能,您可以建議:-)

因此,對於您的特定問題,無法做您想做的事情: stringStringBuilder是兩種完全不同的類型,它們不共享任何有用的接口,也沒有有用的約束,可以讓您在通用方法中同時使用它們(擴展方法)。 您將無法針對此特定情況實現這兩種擴展方法。

關於問題標題“為泛型類型編寫擴展方法” ),是的,可以對泛型使用這種擴展方法,並且該方法對於滿足T約束的所有類型都適用。 沒有特定的約束(例如接口),這沒有多大意義,因為您基本上不能對對象做任何事情……而且,如果您不使用約束,則最好采用以下方法作為擴展方法: object

在這可能有用的地方唯一想到的是,如果嘗試制作一種類型的擴展方法,該方法需要將相同的類型作為附加參數傳遞……類似於:

public static int Compare<T>(this T value, T value2)
    where T : IComparable
{
    return value.CompareTo(value2);
}

您要確保第二個參數與擴展對象的類型相同。

不幸的是,沒有簡單的方法可以實現這一目標

您不能使用任何從泛型中獲取參數的構造函數。 它們僅限於“新T()”。

您可以使用反射來解決此問題,但是它將使您的代碼難以理解,並阻止編譯時類型檢查。

暫無
暫無

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

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