[英]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擴展方法非常糟糕且無用。
您的方法有兩個問題。 給您一個錯誤的是,如果您想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)
或任何類似的約束)。 可能是一個不錯的功能,您可以建議:-)
因此,對於您的特定問題,無法做您想做的事情: string
和StringBuilder
是兩種完全不同的類型,它們不共享任何有用的接口,也沒有有用的約束,可以讓您在通用方法中同時使用它們(擴展方法)。 您將無法針對此特定情況實現這兩種擴展方法。
關於問題標題 ( “為泛型類型編寫擴展方法” ),是的,可以對泛型使用這種擴展方法,並且該方法對於滿足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.