【问题标题】:C# generic class accepting a inherited type.接受继承类型的 C# 泛型类。
【发布时间】:2011-07-29 19:14:32
【问题描述】:

**前言我对泛型很陌生。我创建了一个名为 Geno 的类。我的 Peno 类只包含一个字符串 Name 属性。我想知道为什么我不能从这个类的方法中调用 T.Name 。我如何访问 T 上的属性?有什么好的资源可以说明这是如何工作的吗?

public class Geno<T> where T : Peno
{

}

public string GetName()
{
   return T.Name;
}

【问题讨论】:

  • T 是一个类型,而不是一个实例。
  • 为什么投反对票?他说他刚接触仿制药,并提出了一个很好的问题,它们是如何工作的。

标签: c# class generics


【解决方案1】:

您的Name 属性是实例属性还是静态属性?如果它是静态属性,则无论如何您都不会得到多态性 - 您可以调用 Peno.Name

如果它是一个实例属性,您需要一个实例来调用它。例如:

public class Geno<T> where T : Peno
{
    private readonly T value;

    public Geno(T value)
    {
        this.value = value;
    }

    public string GetName()
    {
       return value.Name;
    }    
}

如果这没有帮助,请给出一个更完整的例子来说明你正在尝试做什么。

【讨论】:

  • Argh ... 打字时我已经想“快点!你必须比 Jon Skeet 快!”。也许下次吧! ;-)
【解决方案2】:

TPeno 类型。所以你尝试做的是Peno.Name,这可能不是你想要的。这样的事情会起作用:

public string GetName(T t)
{
    return t.Name;
}

【讨论】:

    【解决方案3】:

    静态属性不支持继承。因此,您可以直接调用 Peno.Name 而不是 T。

    如果你想访问一个普通的属性,你需要创建一个 T 的实例,它可以让你调用它的属性名称。

    【讨论】:

      【解决方案4】:

      T 是一个通用类型参数,而不是传递给使用 T 的类的参数。

      一个很好的例子是List&lt;T&gt;你说这是一个列表,这意味着你正在创建一个包含字符串类型对象的列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-27
        • 2015-09-15
        • 1970-01-01
        • 2018-08-01
        相关资源
        最近更新 更多