访问我的派生类成员

时间:2014-05-14 14:26:29

标签: c# .net inheritance

我有几个班级来自这个班级:

 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个记忆

3 个答案:

答案 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手动提取每个元素的具体原因,例如如果您实际上将新值存储回列表中。

相关问题