作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有下面的代码:
public class Anything
{
public int Data { get; set;}
}
public class MyGenericBase<T>
{
public void InstanceMethod(T data)
{
// do some job
}
public static void StaticMethod(T data)
{
// do some job
}
// others members...
}
public sealed class UsefulController : MyGenericBase<Anything>
{
public void ProxyToStaticMethod()
{
StaticMethod(null);
}
// others non derived members...
}
public class Container
{
public UsefulController B { get; set; }
}
public class Demo
{
public static void Test()
{
var c = new Container();
c.B.InstanceMethod(null); // Works as expected.
c.B.StaticMethod(null); // Doesn't work.
// Static method call on object rather than type.
// How to get the static method on the base type ?
c.B.ProxyToStaticMethod(); // Works as expected.
}
}
编译器很生气...我理解错误信息,但我不知道如何解决这个问题。我试图获取一个类型而不是一个对象来进行我的静态方法调用,但我找不到正确的方法。此外,这会导致一些不优雅的事情。
基本上,GenericBase 是一个来自框架的类,有很多静态方法和一些实例方法。 Controller 正在输入此类并扩展它。
容器是一组逻辑相关的 Controller 。
有趣的是:此代码的 Java 版本编译正确,但有警告。执行也是正确的。
是否存在解决此问题的设计模式?
感谢您的投入!
感谢您的回答,我找到了解决此问题的方法。它似乎有效,但我不知道是否有副作用。
public class GenericBase<T> : MyGenericBase<T>
{
// Create instance calls here for every base static method.
}
public sealed class UsefulController : GenericBase<Anything>
{
// others non derived members...
}
最佳答案
对静态方法的调用将被编译为调用特定类上的特定静态方法。换句话说,它不会使用 B 的内容来确定调用哪个静态方法。
因此调用必须在编译时可解析,因此它会提示,因为据它所知,您可以用多个具体类型替换该属性的内容,这意味着对静态方法的调用必须被解析为这些类中的任何一个中的静态方法。
编译器没有虚拟或抽象静态方法之类的东西,因此您不能保证所有这些类都有该静态方法。由于调用必须在编译时可解析,因此不会像那样工作。
正如您所注意到的,您可以调用对象的实例方法,该方法又会调用静态方法。这不会使上述规则无效,因为当编译器编译该实例方法时,它将调用哪个静态方法是常量和已知的。
关于C# 编译器 : cannot access static method in a non-static context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809550/
我是一名优秀的程序员,十分优秀!