如何将泛型类型返回为强类型类型

本文关键字:强类型 类型 返回 泛型类型 | 更新日期: 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;
}