C# 从相同的父对象和自定义属性派生出的不同类型的对象列表。

问题描述 投票:0回答:1

我想创建一个不同类型的对象列表,这些对象从同一个父类派生出来,并访问其自定义属性。

这些是我的类。

    abstract class Signal
    {
    }

    abstract class Signal<T>:Signal
    {
        public T Value { get ; set; }

         public Signal(T value)
        {
            Value = value;
        }
    }

    class scalar_signal : Signal<int>
    {
        public scalar_signal(int value):base(value)
        {
        }
    }

    class array_byte_signal: Signal<byte[]>
    {
        public array_byte_signal(byte[] value):base(value)
        {
        }
        public override string ToString()
        {
            return string.Join("; ", Value);
        }
    }

这是我的程序

    static void Main(string[] args)
    {
        var signals = new List<Signal>();

        signals.Add(new scalar_signal(3));
        signals.Add(new array_byte_signal(new Byte[] { 0, 1 }));

        foreach (var signal in signals)
        {
            Console.WriteLine(signal.Value); //Compilation error: Value is not defined in Signal
        }
    }

如你所见,我可以创建一个不同类型的信号列表 但我不能访问它们的属性。

我真的需要一个包含所有信号的列表(或任何其他集合),因为以后处理起来会更容易。

我必须为每种类型的信号实现一个类,因为它们需要根据T的类型实现一个自定义的行为。T也可以是一个代表复数、矩阵等的类。

我读过关于Covariance和concvariance的文章,但我不明白这对我有什么帮助。

谢谢你的帮助。

c# inheritance collections covariance
1个回答
0
投票

这是因为

循环时

foreach (var signal in signals)
{
     Console.WriteLine(signal.Value); //Compilation error: Value is not defined in Signal
}

类型为信号

你现在已经没有属性了。

你需要做的是问它是否能成为别的东西。

foreach (var signal in signals)
{
   //#6
   if(signal  is scalar_signal)
   {
       var typeCast = (scalar_signal)signal;
       Console.WriteLine(typeCast .Value);
   }

   //#7.2 +
   if(signal  is scalar_signal valueTypeName)
   {
       Console.WriteLine(valueTypeName.Value);
   }
}

这应该有助于

© www.soinside.com 2019 - 2024. All rights reserved.