我有几个班级来自这个班级:
public abstract class Class1
{
private string _protocol;
private static List<Plus> _class1Objects;
public string Protocol
{
get { return _protocol; }
set { _protocol = value; }
}
public static List<Plus> Class1Objects
{
get { return _class1Objects; }
set { _class1Objects = value; }
}
}
派生类:
public class Class2 : Plus
{
public bool name;
public int id;
}
public Webmail(string name, int id)
{
if (Class1Objects == null)
Class1Objects = new List<class1>();
.....
Class1Objects.Add(this);
}
在我的列表满载Class1Objects
后:
for (int i = 0; i < Class1.Class1Objects.Count; i++)
{
if (Class1.Class1Objects[i].GetType() == typeof(Class2))
}
(Class2)Class1.Class1Objects[i].
}
}
在(Class2)Class1.Class1Objects[i].
之后我无法看到我的Class2
个记忆
答案 0 :(得分:0)
正确的语法是:
((Class2)Class1.Class1Objects[i]).name;
因为在您的情况下,当您键入以下内容时:
(Class2)Class1.Class1Objects[i].name;
您尝试访问name
的成员Class1.Class1Objects[i]
,然后才尝试将其投放到Class2
。
另外,如果使用foreach,整个循环会简单得多:
using System.Linq;
foreach(Class2 c in Class1.Class1Objects.OfType<Class2>())
{
Console.WriteLine(c.name); // or whatever you need to do with it
}
答案 1 :(得分:0)
您还需要一个额外的paranthese:
((Class2)Class1.Class1Objects[i]).
目前阅读如下:
(Class2)(Class1.Class1Objects[i].) //<= at the '.' it is still a class1
但大卫在评论中说:如果所有类型都是Class2
,那么它应该是该类型的集合,如果不是,你应该检查类型,与foreach
一起检查:
foreach(var item in Class1.Class1Objects)
{
if(item is Class2)
((Class2)Class1.Class1Objects[i]).
}
答案 2 :(得分:0)
使用as
:
for (int i = 0; i < Class1.Class1Objects.Count; i++)
{
var c2 = Class1.Class1Objects[i] as Class2;
if (c2!=null)
}
c2.<whatever was meant to come after the .>
}
}
您可能还需要考虑切换到foreach
,除非您想要从List
手动提取每个元素的具体原因,例如如果您实际上将新值存储回列表中。