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

C# 如何将泛型类型返回为强类型类型,c#,generics,c#-4.0,polymorphism,C#,Generics,C# 4.0,Polymorphism,我正在将一些Delphi代码移植到C#上,在一个系统上,我可以从同一个源代码中读取不同类型的字段。我想使用一个父类并封装所有子类的内部do方式,以隐藏每个字段类型的内部和具体机制 我举了一个简单的例子来说明“我的问题”在哪里: 但错误是我没有从ParentField类实现抽象方法 我尝试将ParentField.GetRealStrongTypedValue更改为虚拟,实现假内容,但多态性根本不运行,总是使用精确的ParentField.GetRealStrongTypedValue来返回假内容

我正在将一些Delphi代码移植到C#上,在一个系统上,我可以从同一个源代码中读取不同类型的字段。我想使用一个父类并封装所有子类的内部do方式,以隐藏每个字段类型的内部和具体机制

我举了一个简单的例子来说明“我的问题”在哪里:

但错误是我没有从
ParentField
类实现抽象方法

我尝试将
ParentField.GetRealStrongTypedValue
更改为虚拟,实现假内容,但多态性根本不运行,总是使用精确的
ParentField.GetRealStrongTypedValue
来返回假内容

有什么简单聪明的主意吗?:-)


谢谢…

我认为您想要做的不是将
MyStringField
设置为泛型,而是将其设置为
ParentField
的特定类型实现

公共密封类MyStringField:ParentField
{
公共覆盖对象值
{
获取{return valor;}
设置{valor=(字符串)值;}
}
公共重写字符串GetRealStrongTypedValue
{
获取{return valor;}//错误。。。
}
私人字符串勇气;
}

为什么不把它保持为
T
?因为这样我每次都必须在“消费者”代码中进行转换。这只是为了方便。我比我自己更清楚地告诉你我想要什么。非常感谢…:-)
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;
    }
}
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;
}
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;
}