1

例子:

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

}

可能吗?如果没有,还有其他方法吗?

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

4

3 回答 3

1

我预见到的问题是你如何保证支持?TStaticMethod

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

using System.Reflection;

public void func()
{
    var staticMethod = typeof(T).GetMethod("StaticMethod", BindingFlags.Public | BindingFlags.Static);
    staticMethod.Invoke(null, null);
}
于 2020-01-01T17:45:32.577 回答
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# 的语法中表达这一点,在这种情况下,规范不允许使用类型参数

类型参数不能在成员访问(成员访问)或类型名称(命名空间和类型名称)中用于标识静态成员或嵌套类型。

如果要在运行时根据' 的值动态T调用静态方法,请参考@Martin 的反射解决方案。

于 2020-01-01T18:54:12.523 回答
0

如果它不依赖于通用类型,您可以调用任何静态方法。如果你有一个像

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

你可以打电话

 int n = Test<int>.Result;

在任何你想要的地方,你实际插入什么类型并不重要,因为任何类型都会做同样的事情

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

会做同样的事情。

如果您的功能取决于 T 像

    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);

你可以把这个函数放在你想要的任何类中,因为它是静态的。无需将此函数放在泛型类中。

于 2020-01-01T21:12:07.537 回答