【问题标题】:C# Generics and typesC# 泛型和类型
【发布时间】:2010-11-19 13:08:35
【问题描述】:

我有一个类似的通用方法:

public abstract T method<T>(int arg) where T : class, new();

然后我在子类中实现

public MyType method<MyType>(int arg){
    MyType e = new MyType();

    e.doStuff (arg); // ERROR HERE

    return s;
}

但我无法访问 MyType 的成员...怎么会?我可以添加什么来启用它们吗?

谢谢

大声

【问题讨论】:

  • 要访问 Type 的成员,您必须对基类、接口或使用反射进行约束。
  • @Miloud - &lt;code&gt; 标签在编写您的问题时不起作用 - 我已对其进行了编辑以供您整理。您只需要将代码缩进 4 个空格,或突出显示它并按代码 (0101) 按钮。
  • 你确定你没有错过override吗?
  • moi_meme 谢谢我明白了。克拉克感谢您的格式;)和马克格拉维尔我确实错过了一个覆盖(错误的复制/粘贴)呵呵
  • oupse 应该是 return e;拼写错误

标签: c# .net generics


【解决方案1】:

你可以这样做(注意我已经移动了你的一些通用参数和约束)。

public class MyType
{
    public void doStuff(int i){}
}
public abstract class ABase<T>where T : class, new()
{
    public abstract T method(int arg);
}

public class AChild : ABase<MyType>
{
    override public MyType method(int arg)
    {
        MyType e = new MyType();

        e.doStuff(arg); // no more error here

        return e;
    }
}

【讨论】:

  • 这可能是一种非常有效的技术。我也在这里演示过:stackoverflow.com/questions/2246587/…
  • 感谢 Albin,我之前也是这么想的,但实际上它把我的代码变成了一张丑陋的老太太的脸,呵呵
  • @Miloud B,您的另一个选择是使用 doStuff 方法创建一个接口并将其添加到方法约束where T : IMyInterface, new();
  • 阿尔宾你上面的代码是我需要的,刚开始看错了,非常感谢!
  • @Albin 你确定它叫做覆盖公共而不是公共覆盖吗?
【解决方案2】:

C# 没有模板特化。您只是简单地用名为 MyType 的类型参数声明了一个新方法,它与名为 MyType没有任何关系

您可以强制转换,或者使用通用约束来声明T至少MyType

另一种选择是在T 中使基本类型自身 泛型(并从方法中删除泛型),并具有具体类型: TheBaseType&lt;MyType&gt;

【讨论】:

  • 等一下,我对 cast 选项很感兴趣,但它涉及到同样的事情,如果我投射到 MyType 它仍然是免费的成员.. 你如何投射它你自己?
  • @Miloud - 如果不了解场景,我无法真正澄清更多; s 是什么? MyType 是什么? TMyType 是什么关系?例如,类型约束可能是这样做的方法,但我不确定具体实现是否应该创建TMyType
  • 如果您在方法MyType 中保留泛型类型的名称并转换为MyType,则您将转换为泛型类型,而不是实际的MyType 类型。将方法的通用参数重命名为其他名称(例如,T),然后将 T 的实例转换为 MyType
  • 我明白了 Marc 的意思,实际上我想要实现的目标是不可能的,我为 Type 和 Generic 使用了不同的名称,但它并没有改变任何东西,正如你所说,即使我转换为 MyType 它仍然是泛型类型,因此无法访问其属性。我想我要从头开始重新启动我的代码并以不同的方式思考,谢谢你的帮助:)
  • @Miloud - 见上面 Greg 的观点;通用参数实际上应该是T;那么TMyType之间的区别
猜你喜欢
  • 2010-11-02
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多