是否可以在类中定义任何类型的列表,该列表可以包含任何类型的列表

时间:2018-01-26 06:37:27

标签: c# .net generics

public class DataTableRequest
{
    public int draw { get; set; }
    public int start { get; set; }
    public int length { get; set; }
    public List<Column> columns { get; set; }
    public Search search { get; set; }
    public List<Species> data { get; set; }/*here I want to hold list of any type */
    public int recordsTotal { get; set; }
}

以上是存在属性的模型列表数据,其中我想要保存以下模型的数据。我不想在DataTableRequest for Chemical中创建另一个列表属性。我想要一种方法来创建一个属性,该属性可以保存两种模型的列表。

public partial class Species
{
    public int SpeciesId { get; set; }
    public string SpeciesName { get; set; }
    public string FileName { get; set; }
    public bool IsActive { get; set; }
}

public partial class Chemical
{
    public int ChemicalId { get; set; }
    public string ChemicalName { get; set; }
    public string FileName { get; set; }
    public bool IsActive { get; set; }
}

无论如何定义一个可以保存化学品和物种清单的清单吗?

5 个答案:

答案 0 :(得分:2)

是的,一种方法是添加基类并从中继承。

示例:

首先添加基类......

class BaseClass
{}

class Species : BaseClass
{...}

class Chemical : BaseClass
{...}

...然后将您的列表定义为

public List<BaseClass> data { get; set; } 

答案 1 :(得分:2)

使用泛型

void Main()
{
    var speciesDataTableRequest = new DataTableRequest<Species>();
    var chemicalsDataTableRequest = new DataTableRequest<Chemical>();
}

// Define other methods and classes here
public class DataTableRequest<T>
{
    public int draw { get; set; }
    public int start { get; set; }
    public int length { get; set; }    
    public List<T> data { get; set; }/*any type now*/
    public int recordsTotal { get; set; }
}

public partial class Species
{
    public int SpeciesId { get; set; }
    public string SpeciesName { get; set; }
    public string FileName { get; set; }
    public bool IsActive { get; set; }
}

public partial class Chemical
{
    public int ChemicalId { get; set; }
    public string ChemicalName { get; set; }
    public string FileName { get; set; }
    public bool IsActive { get; set; }
}

答案 2 :(得分:2)

有两种方法可以实现这一目标。

  1. 将您的data属性定义为List<object> 或仅ArrayList,这实际上又是一个对象列表。 使用此方法每次您需要根据对象的类型进行查找时,您必须使用is运算符检查对象的实际类型。

  2. 第二个选项是执行@ViRuSTriNiTy所说的 - 引入一个人工基类,但查找需要遵循与第一种情况类似的模式。您还可以在此处使用标记界面(没有任何成员的界面)。但同样,您从这种方法中获得的唯一好处是,您将使用泛型并减少您可以在data属性中存储的对象类型。

  3. 如果您有能力更改DataTableRequest类型,最好为两种不同类型添加两个单独的通用列表。或者,如果这不是一个选项,只需将过滤器属性添加到DataTableRequest,如下所示:

    public class DataTableRequest
    {
        // the list of existing properties here
        public List<object> Data {get; set;}
    
        public IEnumerable<Species> Species
        {
            get { return this.Data.OfType<Species>(); }
        }
    
        public IEnumerable<Chemical> Chemicals
        {
            get { return this.Data.OfType<Chemical>(); }
        }
    }
    

    这些只会帮助您迭代特定类型的对象,以备不时之需。当然,如果您没有这样的情况,则不应添加这些属性。

答案 3 :(得分:1)

你可以用最少的代码更改来实现它,就像这样 -

只需添加一个界面并包含您的类列表(可以扩展,以防新类添加

public interface IListOfAnything
    {
        List<Species> ListOfSpecies { get; set; }
        List<Chemical> ListOfChemical { get; set; }
        // List<SomeNewitem> ListOfSomeNewitem { get; set; }
    }

public class DataTableRequest
{
    public int draw { get; set; }
    public int start { get; set; }
    public int length { get; set; }
    public List<Column> columns { get; set; }
    public Search search { get; set; }
    public IListOfAnything data { get; set; }/*here you get list both type of model */
    public int recordsTotal { get; set; }
}

你的Main()看起来像这样 -

static void Main(string[] args)
{
     DataTableRequest dtr = new DataTableRequest();
     dtr.data.ListOfChemical = new List<Chemical>();
     dtr.data.ListOfSpecies = new List<Species>();
     // dtr.data.ListOfSomeNewitem = new List<SomeNewitem>();
}

这样就可以尽可能地保留当前的代码结构。

答案 4 :(得分:0)

您不能为此目的使用泛型,但根据类的结构,您可以引入类的通用接口

public interface IData
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string FileName { get; set; }
    public bool IsActive { get; set; }
}

public class Species :IData {}

public class Chemical :IData {}

前缀“SpeciesId”和“ChemicalId”是多余的,因为类的名称将代表所需信息。