C# 不同列表 类
C# List of different classes
我在搜索中没有找到答案。
我需要一个包含不同 classes 的列表,它们中的每一个都是从基础 class BaseA
中固有的,但是它们中的每一个都将具有其他人不具有的属性,或者一些使用相同 class 的会。
public class BaseA
{
public int ID = 0;
}
public class AA : BaseA
{
public int AID = 0;
}
public class AB : BaseA
{
public int BID = 1;
}
public class AC : BaseA
{
public int CID = 0;
}
现在的问题是如何获得可能包含 class AA、AB 和 AC 的单个列表,编辑不会认为我只使用其中一个。
我尝试制作 List<BaseA>
,但这只会暴露 bassA 属性,而我需要的是能够做到 List[0].AID
如果我可以理解 AID 的含义我说的是 AA class.
我可能做错了,有人能给我指出正确的方向吗?
您可以为此尝试使用 Linq:
List<BaseA> list = ...
var result = list
.OfType<AA>() // Filter out AA instances only
.ElementAt(0) // or just First();
.AID;
你在找演员吗?
var list = new List<BaseA>
{
new AA(),
new AB(),
new AC(),
}
var aa = list[0] as AA;
if (aa != null)
{
var id = aa.AID;
}
需要在基 class 中放置一个变量或 属性 来存储它是什么类型,然后尝试强制转换(List[0] as AA),如果它没有 return null 使用新转换的对象 select 所需的变量。
真正的问题是为什么派生的 classes 需要它们自己的 ID 变量,尤其是当您将它们放入基于所述 ID 的列表中时。
有一种简单而优雅的方法可以做到这一点。在你的基础中提供一个抽象方法class(或多个):
public abstract void AID(parameters);
并且在每个 classes 中覆盖该方法以执行与该 class 相关的特定操作。
或者你可以换一种方式;检查每个对象是否是每个 classes:
的类型
if(obj is AA){
//do AA stuff
}
if(obj is AB){
//do AB stuff
}
if(obj is AC){
//do AC stuff
}
您可以尝试多种方法,
- 按照您的方法,将列表中的项目投射到
((AA)List[0]).AID
。
您应该对它属于 AA
的对象有一些了解,以便访问它上面的 属性 AID
。
如果您的要求仅限于您所描述的用法,那么我建议您使用下面提供的类似内容
class BaseA
{
public string ObjectType { get; set; } //enum would be a good choice.
public int ID { get; set; }
(or)
public Dictionary<string,int> AllProperties { get; set; }
}
使用这种方法,您可以检查 class 的类型并对其调用适当的 属性。
我在搜索中没有找到答案。
我需要一个包含不同 classes 的列表,它们中的每一个都是从基础 class BaseA
中固有的,但是它们中的每一个都将具有其他人不具有的属性,或者一些使用相同 class 的会。
public class BaseA
{
public int ID = 0;
}
public class AA : BaseA
{
public int AID = 0;
}
public class AB : BaseA
{
public int BID = 1;
}
public class AC : BaseA
{
public int CID = 0;
}
现在的问题是如何获得可能包含 class AA、AB 和 AC 的单个列表,编辑不会认为我只使用其中一个。
我尝试制作 List<BaseA>
,但这只会暴露 bassA 属性,而我需要的是能够做到 List[0].AID
如果我可以理解 AID 的含义我说的是 AA class.
我可能做错了,有人能给我指出正确的方向吗?
您可以为此尝试使用 Linq:
List<BaseA> list = ...
var result = list
.OfType<AA>() // Filter out AA instances only
.ElementAt(0) // or just First();
.AID;
你在找演员吗?
var list = new List<BaseA>
{
new AA(),
new AB(),
new AC(),
}
var aa = list[0] as AA;
if (aa != null)
{
var id = aa.AID;
}
需要在基 class 中放置一个变量或 属性 来存储它是什么类型,然后尝试强制转换(List[0] as AA),如果它没有 return null 使用新转换的对象 select 所需的变量。
真正的问题是为什么派生的 classes 需要它们自己的 ID 变量,尤其是当您将它们放入基于所述 ID 的列表中时。
有一种简单而优雅的方法可以做到这一点。在你的基础中提供一个抽象方法class(或多个):
public abstract void AID(parameters);
并且在每个 classes 中覆盖该方法以执行与该 class 相关的特定操作。
或者你可以换一种方式;检查每个对象是否是每个 classes:
的类型if(obj is AA){
//do AA stuff
}
if(obj is AB){
//do AB stuff
}
if(obj is AC){
//do AC stuff
}
您可以尝试多种方法,
- 按照您的方法,将列表中的项目投射到
((AA)List[0]).AID
。
您应该对它属于 AA
的对象有一些了解,以便访问它上面的 属性 AID
。
如果您的要求仅限于您所描述的用法,那么我建议您使用下面提供的类似内容
class BaseA
{
public string ObjectType { get; set; } //enum would be a good choice.
public int ID { get; set; }
(or)
public Dictionary<string,int> AllProperties { get; set; }
}
使用这种方法,您可以检查 class 的类型并对其调用适当的 属性。