2015-08-03 219 views
1

我想建立一個通用的擴展方法,可以應用於任何類,但我不知道如何做到這一點。是否可以使用擴展方法擴展泛型類?

到目前爲止,我有:

public static class ClassExtensionMethods 
{ 
    public static string GetName(this class tempClass) 
    { 
     return typeof(tempClass).Name; 
    } 
} 

,所以我可以用它作爲:

var NameOfClass1 = MyClass.GetName(); 
var NameOfClass2 = DiffClass.GetName(); 

但目前這並不編譯。

是否可以做到這一點或我必須做一個Type擴展方法?

回答

4

你不能有一個靜態的擴展方法,我看不到任何解決方法來實現你想要的。

這是怎麼回事?

var nameOfClass1 = typeof(MyClass).Name; 

那還太長嗎?沒辦法縮短。

好的,把擴展名放在Type上,因爲你不能擴展class。您只能在值上擴展,而不能在類型上擴展。

所以你Type擴展方法是:

public static string GetName(this Type type) 
{ 
    return type.Name; 
} 

而且你會用它想:

typeof(MyClass).GetName(); 
+0

我的例子稍微簡單化了。實際上,我得到一個SQLite tableName。這意味着擴展方法最初將嘗試從屬性返回到類的名稱中獲取名稱。我可以擴展類型嗎? – user1

+1

@ user1該示例過於簡化。 'Name'是'Type'的一部分,因此可用於所有類。除非您提供了類型約束,否則您將無法調用任何其他方法。你試圖解決的*實際*問題是什麼? –

+0

'這個類型tempClass'應該這樣做。無論如何,你仍然需要使用'typeof'類似'typeof(MyClass).GetName()'。 – tia

1

就使該方法一般:

public static class ClassExtensionMethods 
{ 
    public static string GetName<T>(this T tempClass) 
    { 
     return typeof(T).Name; 
    } 
} 

這需要你在T的實例上調用該方法。
但是你的情況並不是一個很好的例子,因爲你可以直接調用.Name;不需要擴展方法。
如果你只想限制噸至類,你可以添加where T : class

public static string GetName<T>(this T tempClass) where T : class 
{ 
    return typeof(T).Name; 
} 
+0

我在哪裏添加'T contraint?' – user1

+0

@ user1請參閱編輯 –

+0

我試過這種方法。我不知道它的工作原理..'MyClass.GetName()'不適用於我的課程。你設法讓這個工作?它僅適用於對象的實例,而不適用於對象 – user1