访问继承的泛型类的属性

时间:2018-10-03 14:47:29

标签: c#

基于以下主题:C# - Multiple generic types in one list

请考虑以下代码:

public abstract class Metadata
{
}

public class Metadata<T> : Metadata
{
    public string Name {set; get;}
}

public class MetaDataCollection
{
    public void DoSomeThing()
    {
        List<Metadata> metadataObjects = new List<Metadata>
        {
            new Metadata<int>() { Name = "Name 1"},
            new Metadata<bool>() { Name = "Name 2"},
            new Metadata<double>() { Name = "Name 3"},
        };

        foreach(vat item in metadataObjects)
        {
            item.Name ??????
        }
    }
}

在上面的代码中,我如何访问Name属性?

谢谢

编辑1)

感谢@BWA。但是我有一个通用属性:

public class Metadata<T> : Metadata
{
    public override string Name {set; get;}

    public List<T> Some {set; get;} <-----
}

,我无法在基本抽象类中声明它。对于那个财产,我能做什么?

3 个答案:

答案 0 :(得分:3)

您的代码无法编译。

Metadata, Metadata<T>, Metadata<int> ...

每个都是不同的类型。泛型类型不是继承。您不能以这种方式执行此操作。

您可以通过以下方式进行:

using System.Collections.Generic;

public abstract class Metadata
{
    public abstract string Name { set; get; }
}

public class Metadata<T> : Metadata
{
    public override string Name {set; get;}
}

public class MetaDataCollection
{
    public void DoSomeThing()
    {
        List<Metadata> metadataObjects = new List<Metadata>
        {
            new Metadata<int>() { Name = "Name 1"},
            new Metadata<bool>() { Name = "Name 2"},
            new Metadata<double>() { Name = "Name 3"},
        };

        foreach(Metadata item in metadataObjects)
        {
            string s = item.Name;
        }
    }
}

首先,Metadata<T>必须继承自Metadata。然后继承就可以了。

答案 1 :(得分:1)

现在,元数据和元数据无关。它们没有继承关系,只是名称相似。

一种选择是将Name属性拉到元数据并让元数据继承自它:

public abstract class Metadata
{
    public string Name {set; get;}
}

public class Metadata<T>:Metadata
{
    //public string Name {set; get;}
}

另一种选择是将Metadata转换为具有Name属性的接口:

public interface IMetadata
{
    string Name {set; get;}
}

public class Metadata<T>:IMetadata
{
    public string Name {set; get;}
}

更改测试代码以使用正确的基类,例如:

{
    var metadataObjects = new List<Metadata>
    {
        new Metadata<int>() { Name = "Name 1"},
        new Metadata<bool>() { Name = "Name 2"},
        new Metadata<double>() { Name = "Name 3"},
    };

    var metadataObjects = new List<IMetadata>
    {
        new Metadata<int>() { Name = "Name 1"},
        new Metadata<bool>() { Name = "Name 2"},
        new Metadata<double>() { Name = "Name 3"},
    };

在两种情况下,循环都保持不变:

    foreach(var item in metadataObjects)
    {
        Console.WriteLine(item.Name);
    }

答案 2 :(得分:0)

这不是您想要的,但是它会给您您要求的结果。

public class Metadata
{
   public Type type { get; set; }
   public string Name { set; get; }
}

public class MetaDataCollection
{
   public void DoSomeThing()
   {
      List<Metadata> metadataObjects = new List<Metadata>
      {
         new Metadata() { Name = "Name 1", type = typeof(int)},
         new Metadata() { Name = "Name 2", type = typeof(bool)},
         new Metadata() { Name = "Name 3", type = typeof(double)},
      };

      foreach (Metadata item in metadataObjects)
      {
         item.Name..
      }
   }
}