Bra*_*ore 11 c# oop generics static
public class BusinessObjects<O>
where O : BusinessObject
{
void SomeMethod()
{
var s = O.MyStaticMethod(); // <- How to do this?
}
}
public class BusinessObject
{
public static string MyStaticMethod()
{
return "blah";
}
}
Run Code Online (Sandbox Code Playgroud)
是否有正确的面向对象的方法来实现这一点,还是我需要求助于反思?
编辑:我试图过分简化这个问题,并且遗漏了一个重要的观点.MyStaticMethod使用反射并需要派生类型来返回正确的结果.但是,我刚刚意识到我设计中的另一个缺陷是我无法使用静态虚拟方法,我认为这就是我需要的.
看起来我需要找到另一种解决这个问题的方法.
Jar*_*Par 12
即使它被约束为类型,也无法通过泛型类型参数访问静态方法.只需直接使用约束类
var s = BusinessObject.MyStaticMethod();
Run Code Online (Sandbox Code Playgroud)
注意:如果您希望基于实例化类型调用静态方法,O那么在没有反射的情况下这是不可能的..Net中的泛型在编译时静态绑定到方法(与在实例化时绑定的C++不同).由于无法静态绑定到实例化类型上的静态方法,因此这是不可能的.虚方法有点不同,因为您可以静态绑定到虚方法,然后让动态调度在实例化类型上调用正确的方法.
不能像这样引用静态成员的原因:
O.MyStaticMethod();
Run Code Online (Sandbox Code Playgroud)
因为你不知道O型是什么。是的,它继承自BusinessObject,但静态成员不能在类型之间继承,因此只能从BusinessObject引用MyStaticMethod。