示例:
Public class a<T> where T: containsStatic
{
public void func()
{
T.StaticMethod();
}
}
有可能吗?如果没有,还有另一种方法吗?
编辑:它给我一个错误:“'T'是一个类型参数,在当前上下文中无效。”这是为什么?有没有办法解决这个问题?
我预见到的问题是,您如何[[保证 T
支持StaticMethod
?
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(); } }
不会。必须是所调用的方法相同。当生成方法的代码时,会静态生成静态方法调用(是的,我知道)。看到
所以您甚至无法用C#的语法a type parameter is disallowed by the spec in such a context来表达这一点:T.Foo()
的编译器将无法在其中插入C.Foo()
以外的任何其他调用。类型参数不能在成员访问(Member access)或类型名称(Namespace and type names)中用于标识静态成员或嵌套类型。如果要
动态
在运行时根据T
的值调用静态方法,请参阅@Martin的反射解决方案。
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);
您可以将此函数放在所需的任何类中,因为它是静态的。无需将此函数放在通用类中。