C#接口静态方法调用泛型

Tot*_*oto 28 c# generics inheritance static interface

有没有一种简单的方法来实现它,如果可能的话,不需要实例化对象:

interface I
{
     static  string GetClassName();
}

public class Helper
{

    static void PrintClassName<T>() where T : I
    {
         Console.WriteLine(T.GetClassName());
    }
}
Run Code Online (Sandbox Code Playgroud)

Kei*_*ith 25

请尝试使用扩展方法:

public interface IMyInterface
{
     string GetClassName();
}

public static class IMyInterfaceExtensions
{
    public static void PrintClassName<T>( this T input ) 
        where T : IMyInterface
    {
         Console.WriteLine(input.GetClassName());
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许您添加静态扩展/实用程序方法,但您仍需要IMyInterface实现的实例.

你不能拥有静态方法的接口,因为它没有意义,它们是没有实例的实用方法,因此它们实际上没有类型.

  • 你无法避免实例,除非你切换到使用反射(如@Kent Boogaart的答案),但是你不应该真正使用泛型,因为你只是传递类型 (2认同)
  • 非常感谢这个答案——一种添加针对特定接口的“util”方法的绝妙方法。我还推荐有关扩展方法的 MSDN 文档(下面的链接)。请注意,MSDN 示例适当地命名了扩展方法,以便调用主体必须特别包含扩展。扩展方法:http://msdn.microsoft.com/en-us/library/bb383977.aspx (2认同)

Dyk*_*kam 7

您不能继承静态方法.您的代码不会以任何方式编译,因为接口因此而无法使用静态方法.

引自littleguru:

.NET中的继承仅适用于实例库.静态方法是在类型级别上定义的,而不是在实例级别上定义的.这就是为什么覆盖不适用于静态方法/属性/事件...

静态方法只在内存中保存一次.没有为它们创建的虚拟表等.

如果在.NET中调用实例方法,则始终为其提供当前实例.这是.NET运行时隐藏的,但它确实发生了.每个实例方法都将第一个参数作为运行该方法的对象的指针(引用).静态方法不会发生这种情况(因为它们是在类型级别定义的).编译器应该如何决定选择要调用的方法?