C#-是否可以在类中调用泛型的静态方法?

问题描述 投票:0回答:3

示例:

Public class a<T> where T: containsStatic
{
    public void func()
    {
        T.StaticMethod();
    }

}

有可能吗?如果没有,还有另一种方法吗?

编辑:它给我一个错误:“'T'是一个类型参数,在当前上下文中无效。”这是为什么?有没有办法解决这个问题?

c# class static static-methods
3个回答
1
投票

我预见到的问题是,您如何[[保证 T支持StaticMethod

但是,如果您确定StaticMethod上始终存在T,则可以使用反射相当简单地完成此操作:

using System.Reflection; public void func() { var staticMethod = typeof(T).GetMethod("StaticMethod", BindingFlags.Public | BindingFlags.Static); staticMethod.Invoke(null, null); }


0
投票
假设我们挥动一根魔杖,您现在就可以这样做。假设类型为C

public class C { public static void Foo() { } }

这将如何:

public class A<T> where T : C { public void Func() { T.Foo(); } }

与以下内容有所不同:

public class A<T> where T : C { public void Func() { C.Foo(); } }

不会。 

必须是所调用的方法相同。当生成方法的代码时,会静态生成静态方法调用(是的,我知道)。看到T.Foo()的编译器将无法在其中插入C.Foo()以外的任何其他调用。

所以您甚至无法用C#的语法a type parameter is disallowed by the spec in such a context来表达这一点:

类型参数不能在成员访问(Member access)或类型名称(Namespace and type names)中用于标识静态成员或嵌套类型。

如果要

动态

在运行时根据T的值调用静态方法,请参阅@Martin的反射解决方案。

0
投票
如果不依赖于通用类型,则可以调用任何静态方法。如果您有类似的课程

public class Test<T> { public static int Result => 5; }

您可以打电话

int n = Test<int>.Result;

在您想要的任何位置,实际插入哪种类型并不重要,因为任何类型都可以做到这一点

int n = Test<string[]>.Result;

将做同样的事情。

如果您的函数依赖T,例如in>]

public class Test1<T> { public static void Action(T param) { } }

您可以使用

Test1<int>.Action(8);

在您想要的任何地方。

也在其他通用类之内:

public class OtherClass<T> { public void Method(T param) { Test1<T>.Action(param); } }

但是通常可以在非通用类中编写通用函数,例如

public class Test2 { public static void Action<T>(T param) { } }

此程序在程序中的任何位置都有效

Test2.Action("string"); Test2.Action(9);

您可以将此函数放在所需的任何类中,因为它是静态的。无需将此函数放在通用类中。
© www.soinside.com 2019 - 2024. All rights reserved.