代码之家  ›  专栏  ›  技术社区  ›  DooDoo

访问继承的泛型类的属性

c#
  •  0
  • DooDoo  · 技术社区  · 7 年前

    基于此主题: 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 回复  |  直到 7 年前
        1
  •  3
  •   BWA Rakesh BG    7 年前

    您的代码无法编译。

    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 . 然后继承就可以工作了。

        2
  •  1
  •   Panagiotis Kanavos    7 年前

    现在,元数据和元数据是不相关的。他们没有继承关系,只是名字相似。

    一种选择是 Name 属性转换为元数据并从中继承元数据:

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

    另一种选择是转换 Metadata 名字 财产:

    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);
        }
    
        3
  •  0
  •   trksyln    7 年前

    我不知道这是否是你想要的,但它会给你你所要求的结果。

    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..
          }
       }
    }