我本来希望做这样的事情,但它在C#中似乎是非法的:
public Collection MethodThatFetchesSomething() where T : SomeBaseClass { return T.StaticMethodOnSomeBaseClassThatReturnsCollection(); }
我得到一个编译时错误:"'T'是'类型参数',在给定的上下文中无效."
给定泛型类型参数,如何在泛型类上调用静态方法?在给定约束的情况下,静态方法必须可用.
在这种情况下,您应该直接在约束类型上调用静态方法.C#(和CLR)不支持虚拟静态方法.所以:
T.StaticMethodOnSomeBaseClassThatReturnsCollection
......可以没有什么不同:
SomeBaseClass.StaticMethodOnSomeBaseClassThatReturnsCollection
通过泛型类型参数是不必要的间接,因此不受支持.
为了详细说明以前的答案,我认为反思更接近你想要的.我可以给出你应该或不应该做某事的1001个理由,我会按照你的要求回答你的问题.我认为你应该在泛型参数的类型上调用GetMethod方法并从那里开始.例如,对于一个函数:
public void doSomething() where T : someParent { List items=(List )typeof(T).GetMethod("fetchAll").Invoke(null,new object[]{}); //do something with items }
其中T是具有静态方法fetchAll()的任何类.
是的,我知道这是非常缓慢的,如果someParent没有强制所有的子类实现fetchAll,它可能会崩溃,但它会回答问题.
调用这种方法的唯一方法是通过反射,但是,听起来可能将该功能包装在接口中并使用基于实例的IoC/factory/etc模式.
听起来你正在尝试使用泛型来解决C#中没有"虚拟静态方法"这一事实.
不幸的是,这不会奏效.