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; }
}
无论如何定义一个可以保存化学品和物种清单的清单吗?
答案 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)
有两种方法可以实现这一目标。
将您的data
属性定义为List<object>
或仅
使用此方法每次您需要根据对象的类型进行查找时,您必须使用ArrayList
,这实际上又是一个对象列表。is
运算符检查对象的实际类型。
第二个选项是执行@ViRuSTriNiTy所说的 - 引入一个人工基类,但查找需要遵循与第一种情况类似的模式。您还可以在此处使用标记界面(没有任何成员的界面)。但同样,您从这种方法中获得的唯一好处是,您将使用泛型并减少您可以在data
属性中存储的对象类型。
如果您有能力更改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”是多余的,因为类的名称将代表所需信息。