首页 > 解决方案 > C# 从相同父属性和自定义属性派生的不同类型对象的列表

问题描述

我正在尝试创建从同一父级派生的不同类型对象的列表并访问其自定义属性。

这些是我的课:

    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 也可以是表示复数、矩阵等的类。

我已经阅读了协方差和逆变,但我不明白这对我有什么帮助。

谢谢您的帮助。

标签: c#inheritancecollectionscovariance

解决方案


这是因为

当你循环

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);
   }
}

这应该有帮助


推荐阅读