我本来希望做这样的事情,但它在C#中似乎是非法的:
public Collection MethodThatFetchesSomething<T>()
where T : SomeBaseClass
{
return T.StaticMethodOnSomeBaseClassThatReturnsCollection();
}
Run Code Online (Sandbox Code Playgroud)
我得到一个编译时错误:"'T'是'类型参数',在给定的上下文中无效."
给定泛型类型参数,如何在泛型类上调用静态方法?在给定约束的情况下,静态方法必须可用.
Jar*_*Par 53
在这种情况下,您应该直接在约束类型上调用静态方法.C#(和CLR)不支持虚拟静态方法.所以:
T.StaticMethodOnSomeBaseClassThatReturnsCollection
Run Code Online (Sandbox Code Playgroud)
......可以没有什么不同:
SomeBaseClass.StaticMethodOnSomeBaseClassThatReturnsCollection
Run Code Online (Sandbox Code Playgroud)
通过泛型类型参数是不必要的间接,因此不受支持.
Jos*_*ech 26
为了详细说明以前的答案,我认为反思更接近你想要的.我可以给出你应该或不应该做某事的1001个理由,我会按照你的要求回答你的问题.我认为你应该在泛型参数的类型上调用GetMethod方法并从那里开始.例如,对于一个函数:
public void doSomething<T>() where T : someParent
{
List<T> items=(List<T>)typeof(T).GetMethod("fetchAll").Invoke(null,new object[]{});
//do something with items
}
Run Code Online (Sandbox Code Playgroud)
其中T是具有静态方法fetchAll()的任何类.
是的,我知道这是非常缓慢的,如果someParent没有强制所有的子类实现fetchAll,它可能会崩溃,但它会回答问题.
小智 14
你可以做我所说的代理单例,我已经将它用作一种“静态继承”有一段时间了
interface IFoo<T> where T : IFoo<T>, new()
{
ICollection<T> ReturnsCollection();
}
static class Foo<T> where T : IFoo<T>, new()
{
private static readonly T value = new();
public static ICollection<T> ReturnsCollection() => value.ReturnsCollection();
}
// Use case
public ICollection<T> DoSomething<T>() where T : IFoo<T>, new()
{
return Foo<T>.ReturnsCollection();
}
Run Code Online (Sandbox Code Playgroud)
听起来你正在尝试使用泛型来解决C#中没有"虚拟静态方法"这一事实.
不幸的是,这不会奏效.
归档时间: |
|
查看次数: |
72519 次 |
最近记录: |