获得对派生类成员的访问权

本文关键字:成员 访问权 派生 | 更新日期: 2023-09-27 18:03:15

我有几个类来自这个类:

 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成员

获得对派生类成员的访问权

你需要一个额外的括号:

((Class2)Class1.Class1Objects[i]).

现在读作如下:

(Class2)(Class1.Class1Objects[i].) //<= at the '.' it is still a class1

但是正如David在他的评论中所说:如果所有的都是Class2类型,它应该是该类型的集合,如果不是,你应该检查类型,与foreach:

foreach(var item in Class1.Class1Objects)
{
    if(item is Class2)
        ((Class2)Class1.Class1Objects[i]).
}

使用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中提取每个元素,例如,如果你实际上存储新的值回到列表

正确的语法是:

((Class2)Class1.Class1Objects[i]).name;

因为在你的例子中,当你输入像这样的东西:

(Class2)Class1.Class1Objects[i].name;

尝试访问Class1.Class1Objects[i]的成员name,然后才尝试将其强制转换为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
}