c# - 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 也可以是表示复数、矩阵等的类。
我已经阅读了协方差和逆变,但我不明白这对我有什么帮助。
谢谢您的帮助。
解决方案
这是因为
当你循环
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);
}
}
这应该有帮助
推荐阅读
- groovy - Groovy 闭包中的字符串引用导致的内存使用
- python - 将现有的 Shell 代码转换为 Python 以进行文件移动
- mysql - 如何创建带有可选参数的 sql 语句
- python - PyInstaller 可执行文件无法执行脚本 pyi_rth_qt5plugins
- spring - 每个角色都有自己的可访问页面
- sql-server - 将数据从 SQL Server 导入到格式化的 Excel 文件
- javascript - HTML CSS:如何使复选框仅在悬停或选中时可见
- android - 当我将 android:ems 的值放入 dimens.xml 时,为什么我的应用程序会崩溃?
- php - 上传的文件无法移动到 wp-content/uploads/2019/06
- angular - Angular 7:带有组件并传递可变参数的 *ngFor