简体   繁体   English

访问继承的泛型类的属性

[英]Access to property of inherited generic class

Based on this topic: C# - Multiple generic types in one list 基于此主题: C#-一个列表中有多个泛型类型

Please consider this code: 请考虑以下代码:

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

in above code how I can access to Name property? 在上面的代码中,我如何访问Name属性?

Thanks 谢谢

EDIT 1) 编辑1)

Thanks @BWA. 谢谢@BWA。 But I have a generic property: 但是我有一个通用属性:

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

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

and I can't declare it in base abstract class. 而且我不能在基本抽象类中声明它。 For that property what I can do? 对于该财产,我能做什么?

Your code doesn,t compile. 您的代码无法编译。

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

Each are different type. 每个都是不同的类型。 Generic types isn't inheritance. 泛型类型不是继承。 You cann't do this in this way. 您不能以这种方式执行此操作。

You can do in this way: 您可以通过以下方式进行操作:

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

At first Metadata<T> must inherit from Metadata . 首先, Metadata<T>必须继承自Metadata And then inheritance can work. 然后继承就可以了。

Right now, Metadata and Metadata are unrelated. 目前,元数据和元数据无关。 They have no inheritance relationship, just similar names. 它们没有继承关系,只是名称相似。

One option is to pull the Name property to Metadata and have Metadata inherit from it: 一种选择是将Name属性拉到Metadata并让Metadata继承自它:

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

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

The other option is to convert Metadata to an interface with a Name property : 另一个选项是将Metadata转换为具有Name属性的接口:

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

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

Change the test code to use the correct base class, eg : 更改测试代码以使用正确的基类,例如:

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

or 要么

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

In both cases, the loop remains the same : 在这两种情况下,循环都保持不变:

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

i don't if this is what you want but its gonna give you the result you ask. 我不是这是否是您想要的,但它会给您您要求的结果。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM