2015-08-03 171 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