Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何访问泛型类型的静态方法 公共类BusinessObjects 其中O:BusinessObject { void方法() { var s=O.MyStaticMethod();//_C#_Oop_Generics_Static - Fatal编程技术网

C# 如何访问泛型类型的静态方法 公共类BusinessObjects 其中O:BusinessObject { void方法() { var s=O.MyStaticMethod();//

C# 如何访问泛型类型的静态方法 公共类BusinessObjects 其中O:BusinessObject { void方法() { var s=O.MyStaticMethod();//,c#,oop,generics,static,C#,Oop,Generics,Static,即使静态方法被约束为类型,也无法通过泛型类型参数访问该方法。只需直接使用受约束的类即可 public class BusinessObjects<O> where O : BusinessObject { void SomeMethod() { var s = O.MyStaticMethod(); // <- How to do this? } } public class BusinessObject { publi

即使静态方法被约束为类型,也无法通过泛型类型参数访问该方法。只需直接使用受约束的类即可

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";
    }
}

注意:如果您想调用基于实例的“代码”> O< /CODE >的静态方法,则不可能进行反射。NET.NETRONGETICS静态地绑定到编译时的方法(不像C++在实例化时间绑定)。。由于无法静态绑定到实例化类型上的静态方法,因此这是不可能的。虚拟方法有点不同,因为您可以静态绑定到虚拟方法,然后让动态分派调用实例化类型上的正确方法。

如果您强制
O
继承SinesObject
,为什么不这样称呼它:

var s = BusinessObject.MyStaticMethod();
void SomeMethod()
{
    var s = BusinessObject.MyStaticMethod(); // <- How to do this?
}
void SomeMethod()
{

var s=BusinessObject.MyStaticMethod();//不能像这样引用静态成员的原因:

var s = BusinessObject.MyStaticMethod();
void SomeMethod()
{
    var s = BusinessObject.MyStaticMethod(); // <- How to do this?
}

这是因为您不知道O是什么类型。是的,它继承自BusinessObject,但静态成员不会在类型之间继承,因此您只能引用BusinessObject中的MyStaticMethod。

我想我没有提供足够的信息。请立即检查更新的问题…@BrandonMoore稍微更新了我的答案,以便更详细地了解限制是Ep,因为我不能有一个虚拟静态方法,这会扼杀我的方法。我认为反思将是一条道路。我认为我可以同样地把这个标记为答案,但因为我只能选择一个,所以我选择了一个在阅读时不会让我思考太多的方法:)@BrandonMoore肯定会选择任何一个您认为最准确地回答了您的问题:)查看此处以了解更多信息:我认为这是一个非常好的问题。目前无法用C#完成。但这对于Microsoft添加到.Net 5+@DanielHilgarth会很有用,删除了错误的示例。虽然编译器允许您通过派生类调用静态方法,但仍然是正确的静态成员不是继承的。生成的IL实际上将调用基类上的方法。同样,尽管编译器允许,从派生类型引用静态方法是不正确的形式,并且可能会导致混淆,特别是在使用创建模式时。当您说编译r将
Foo.MyStaticMethod()
更改为
BusinessObject.MyStaticMethod()
。但是,这并不能使您的答案正确。您只能引用它是不正确的(您的意思是“调用”?)
MyStaticMethod
来自
BusinessObject
。O是一个泛型类型参数。正如我们已经同意的,类型之间没有静态方法的继承,因此您不能期望能够在从该上下文中的BusinessObject派生的某个类型O上调用此方法。编译器团队可以为他提供一些魔法正如他们在显式类型名称案例中所做的那样,但[谢天谢地]他们没有。我同意我的答案没有那么详细,但我仍然不会认为它是错误的。我不同意静态方法没有继承。如果没有继承,
Foo.MyStaticMethod()
确实是无效的。此外,如果您想在
Foo
上提供不同的
MyStaticMethod
实现,您必须使用修饰符,该修饰符用于显式隐藏从基类继承的成员。新修饰符的示例甚至包含一个包含静态成员的示例。唯一需要做的是静态方法没有动态分派,即多态性。我猜这就是为什么OP尝试执行的操作是非法的实际原因,因为没有动态分派,这与使用泛型参数约束的类是一样的(
BusinessObject
)。