以下课程包括
A - 父类
B - 儿童班
持有人 - 包含A&#39的列表
我想从fatherobjects列表中获取子属性。为什么我不能这样做?或者更好的问题,我该怎么做?
public class A
{
public int var = 0;
}
public class B : A
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public B()
{
}
public B(B p_B)
{
Property1 = p_B.Property1;
Property2 = p_B.Property2;
}
}
class Holder
{
private List<A> m_Objects = new List<A>();
public void AddObject(A p_Object)
{
m_Objects.Add(p_Object);
}
public void AddObjectProperty1(B p_B)
{
// At this point, m_Objects holds a B-object. And I want to add the value from Property1
// but there is no Property1 in the A-class so I cant do this. How do I use the base.values from
// a statement like the one below?
int index = m_Objects.FindIndex(item => item.Property1 == p_B.Property1);
if (index > -1)
m_Objects.ElementAt(index).Property1 += p_B.Property1;
}
}
class Program
{
static void Main(string[] args)
{
// Class to hold the objects
Holder h = new Holder();
// Create a B object
B b = new B();
b.Property1 = 1;
b.Property2 = 2;
// Place a new instance of the B-object in a list of A's
h.AddObject(new B(b));
// Add the value from Property1 to the value in the b-object in the a-list. :P
h.AddObjectProperty1(b);
Console.WriteLine(++b.var);
Console.ReadLine();
}
}
答案 0 :(得分:0)
您可以使用类型转换:
(m_Objects[i] as B).Property1
或者
((B)m_Objects[i]).Property1
答案 1 :(得分:0)
在编译时,编译器无法知道,您只需将B
添加到A
列表中。因此,无法保证以下查询中的每个item
都是B
的实例,因此Property1
int index = m_Objects.FindIndex(item => item.Property1 == p_B.Property1);
第一种可能性是在Artyom的答案中施放。但是如果你不是列表中的所有元素都是B
,那么这将失败。因此,如果您依赖m_Objects
中的所有元素作为B
的实例,为什么不使用List<B> m_Objects
?
如果您需要混合列表,则必须在查询中进行类型检查,以确保在转换之前处理B
的实例。
int index = m_Objects.FindIndex(item => (item is B) && (item as B).Property1 == p_B.Property1);