例子:
Public class a<T> where T: containsStatic
{
public void func()
{
T.StaticMethod();
}
}
可能吗?如果没有,还有其他方法吗?
编辑:它给了我错误:“'T' 是一个类型参数,在当前上下文中无效。” 这是为什么?有没有办法来解决这个问题?
例子:
Public class a<T> where T: containsStatic
{
public void func()
{
T.StaticMethod();
}
}
可能吗?如果没有,还有其他方法吗?
编辑:它给了我错误:“'T' 是一个类型参数,在当前上下文中无效。” 这是为什么?有没有办法来解决这个问题?
我预见到的问题是你如何保证支持?TStaticMethod
但是,如果您确定StaticMethod它将始终存在于 上T,则可以使用反射来相当简单地完成此操作:
using System.Reflection;
public void func()
{
var staticMethod = typeof(T).GetMethod("StaticMethod", BindingFlags.Public | BindingFlags.Static);
staticMethod.Invoke(null, null);
}
假设我们挥动一根魔杖,你现在就可以这样做。假设一个类型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 的反射解决方案。
如果它不依赖于通用类型,您可以调用任何静态方法。如果你有一个像
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);
你可以把这个函数放在你想要的任何类中,因为它是静态的。无需将此函数放在泛型类中。