如何访问存储在基类列表中的派生类中的属性

时间:2018-02-04 14:06:34

标签: c# class casting base derived

我正在尝试使用来自同一基类的对象列表。

我有我的基本类型(问题)和派生类型(3TQ,2TQ)

根据情况,列表将全部为一种或其他派生类型。

所以我的所有接口都处理基类型问题的列表。

但是一旦我掌握了列表,就无法访​​问派生类型。

这么长的故事简短 - 如何从基础对象列表中提取可用的派生对象?我觉得这很容易,而且我错过了一些非常明显的东西。

2 个答案:

答案 0 :(得分:1)

你必须使用显式转换,代码看起来像这样,

//这是从类Base派生的Child类。

儿童c =新儿童();

// UpCast可以隐式完成,没有任何问题

基础b = c;

//将对象强制转换为派生所需的显式转换 孩子c1 =(孩子)b;

现在,由于这是运行时操作,因此在不正确的转换时不会出现错误,因此在转换之前总是进行检查。你可以使用"是"或" as"关键字,以下链接将为您提供更多详细信息。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/as

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is

希望这有帮助

答案 1 :(得分:0)

我想我明白了你的意图。你可以在基类中定义虚方法,并在你提到的两个派生类中重写(这肯定能够访问特定于该类的属性。这些重写的方法可能还需要返回一些消耗代码依赖于它的东西。可能在下面的代码片段中,您可以看到:

public class MyBaseClass
    {
        public virtual int MyMethod()
        {
            return default(int);
        }
    }

public class MyDerivedClass1:MyBaseClass
{
    public int MyProperty1 { get; set; }
    public override int MyMethod()
    {
        return MyProperty1;
    }
}

public class MyDerivedClass2 : MyBaseClass
{
    public int MyProperty2 { get; set; }
    public override int MyMethod()
    {
        return MyProperty2;
    }
}

public class MyConsumer
{
    List<MyBaseClass> baselist = new List<MyBaseClass>
    {
        new MyDerivedClass1 {MyProperty1=2 },
        new MyDerivedClass2 {MyProperty2=5 }
    };

    public void TestMethod()
    {
        foreach(var item in baselist)
        {
            var x = item.MyMethod();
            /* take care of your actual logic here*/
        }
    }