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

标签 .net generics

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

编辑:不幸的是,我无权访问 ObjectA 的源代码,而且我要覆盖的成员不是虚拟成员。如果我可以访问 ObjectA 的源代码,我会将成员设为虚拟成员,但由于我无法这样做,因此“覆盖”成员的唯一选择是通过“new”关键字。

class GenericClass 其中 T : ObjectA
{
    公共(public)无效 DoWork(T 项目)
    {
       //当类型参数 'T' 为 ObjectB 时,应该获取 ObjectB 的实现
        item.Invoke();
    }
}

对象A类
{
    公共(public)无效调用()
    {
       //A 的实现...
    }
}

对象B类:对象A
{
    公共(public)新无效调用()
    {
       //B 的实现...
    }
}

静态无效主要()
{
    GenericClass genericClass = new GenericClass();
    ObjectB objectB = new ObjectB();
    genericClass.DoWork(objectB);
}

最佳答案

没有。编译器生成的调用是针对它在编译时知道的成员。这是由 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));
    }
}

关于.net - 泛型:访问新成员,而不是隐藏成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/774726/

相关文章:

c# - 我应该使 C# 私有(private)方法通用吗?

Java 泛型通配符 : <? extends Number> vs <T extends Number>

.net - 在 WPF 中实例化用户控件时 PresentationFramework.dll 中的 System.IO.IOException

c# - TCP 或 UDP 在 c# 中帮助服务器/客户端?

c++ - 使用模板制作类型安全的 C++ "component manager"

java - 应该删除(Object) 为删除(? super E)

Swift 通用约束无法转换值

c# - 如何使用反射将对象添加到类实例的通用列表属性中

c# - SKCanvasView 事件参数仅包含按下操作类型

.net - 检测 C#/.NET 中后台进程的结束?