如何将泛型类型返回为强类型类型
本文关键字:强类型 类型 返回 泛型类型 | 更新日期: 2023-09-27 18:20:54
我正在将一些Delphi代码移植到一个可以从同一源读取不同类型字段的系统上的C#。我想使用一个父类,并封装所有对子类的内部操作方式,以隐藏每个字段类型的内部和具体机制。
我做了一个简单的例子来展示"我的问题"在哪里:
using System;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
ParentField<int> fieldInteger = new MyIntField<int>();
fieldInteger.Value = 12;
ParentField<string> fieldString = new MyStringField<string>();
fieldString.Value = "This is a String";
Console.WriteLine("1. The Integer Value: " + fieldInteger.Value);
Console.WriteLine("1. The String Value: " + fieldString.Value);
int localInteger = fieldInteger.GetRealStrongTypedValue;
string localString = fieldString.GetRealStrongTypedValue;
Console.WriteLine("2. The Integer Value: " + localInteger);
Console.WriteLine("2. The String Value: " + localString);
}
}
public abstract class ParentField<T>
{
public abstract Object Value { get; set; }
public abstract T GetRealStrongTypedValue { get; }
}
public sealed class MyIntField<T> : ParentField<T>
{
public override Object Value
{
get { return valor; }
set { valor = (int)value; }
}
public override T GetRealStrongTypedValue
{
get { return valor; } // ERROR...
}
private int valor;
}
public sealed class MyStringField<T> : ParentField<T>
{
public override Object Value
{
get { return valor; }
set { valor = (string)value; }
}
public override T GetRealStrongTypedValue
{
get { return valor; } // ERROR...
}
private string valor;
}
}
此外,我还尝试从子GetRealStrongTypedValue
实例方法中删除Generic,方法如下:
public sealed class MyStringField<T> : ParentField<T>
{
public override Object Value
{
get { return valor; }
set { valor = (string)value; }
}
public new string GetRealStrongTypedValue
{
get { return valor; }
}
private string valor;
}
但错误是我没有从ParentField
类实现抽象方法。
我曾尝试将ParentField.GetRealStrongTypedValue
更改为虚拟,实现虚假内容,但多态性根本不运行,并且总是使用确切的ParentField.GetRealStrongTypedValue
,因此它返回虚假内容。
有什么简单而聪明的想法吗?:-)
谢谢。。。
我认为您想要做的不是使MyStringField
通用,而是使其成为ParentField<T>
的特定类型实现。
public sealed class MyStringField : ParentField<string>
{
public override Object Value
{
get { return valor; }
set { valor = (string)value; }
}
public override string GetRealStrongTypedValue
{
get { return valor; } // ERROR...
}
private string valor;
}