泛型:访问新成员,而不是隐藏成员

Zac*_*son 1 .net generics

我遇到了泛型和新成员的问题.我写了一个泛型类,它对ObjectA类型的对象进行操作.ObjectB派生自ObjectA并隐藏了ObjectA的一些成员.当我提供ObjectB的类型作为泛型类的类型参数时,我希望当我调用ObjectB隐藏的任何成员时,我将调用ObjectB的实现.但是,CLR仍然调用隐藏成员(ObjectA的实现).这似乎不合逻辑,因为我明确地向泛型类提供了ObjectB的类型.这是泛型本身的问题,还是我做错了什么?

编辑:不幸的是,我无法访问ObjectA的源代码,我想要覆盖的成员不是虚拟的.如果我可以访问ObjectA的源代码,我会将该成员设置为虚拟,但由于我不能这样做,我"覆盖"该成员的唯一选择是通过"new"关键字.

class GenericClass<T> where T : ObjectA  
{  
    public void DoWork(T item)  
    {  
        // When type parameter 'T' is ObjectB, should get ObjectB's implementation  
        item.Invoke();  
    }  
}  

class ObjectA  
{
    public void Invoke()  
    {  
        // A's implementation...  
    }  
}

class ObjectB : ObjectA  
{
    public new void Invoke()  
    {  
        // B's implementation...  
    }  
}

static void Main()  
{  
    GenericClass<ObjectB> genericClass = new GenericClass<ObjectB>();  
    ObjectB objectB = new ObjectB();  
    genericClass.DoWork(objectB);  
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

否.编译器生成的调用是在编译时知道的成员.这是被公开的成员ObjectA.

你有没有使用正常继承,使用虚拟/重写方法的原因?

下面是同样的事的另一个例子,顺便-字符串重载==操作符不使用,即使Tstring在调用Foo:

using System;

class Test
{
    static bool Foo<T>(T first, T second)
        where T : class
    {
        return first == second;
    }

    static void Main()
    {
        string x = "hello";
        string y = new string(x.ToCharArray());

        Console.WriteLine(Foo(x, y));
    }
}
Run Code Online (Sandbox Code Playgroud)