C# 存储多态(通过模板专门化)对象的集合

C# 存储多态(通过模板专门化)对象的集合,c#,polymorphism,template-specialization,C#,Polymorphism,Template Specialization,我有以下问题。我有一个泛型类,它有一个抽象属性,它本身使用泛型参数: abstract class Deserializer<T> { T abstract Deserialize<T>(Node node); } class IntDeserializer:Deserializer<int> { int override Deserialize(Node node){....} } class StringDeserializer:Des

我有以下问题。我有一个泛型类,它有一个抽象属性,它本身使用泛型参数:

abstract class Deserializer<T>
{
    T abstract Deserialize<T>(Node node);
}

class IntDeserializer:Deserializer<int>
{
    int override Deserialize(Node node){....}
}

class StringDeserializer:Deserializer<String>
{
    string override Deserialize(Node node){....}
}   


internal struct Command<T>
{    
    public IReadOnlyList<Component<T>> Components { get; }
    public Deserializer<T> Deserializer { get; }

    public Command(IEnumerable<Component<T>> components)
    {
        this.Deserializer = components.First().AsDeserailizer;
        this.Components = components.Skip(1).ToArray();
    }    
}

您可以使用下面的代码访问
反序列化()
方法

只需列出
动态
对象

 class A
    {

        List<dynamic> deserializers = new List<dynamic>();

        //OR

        //List<object> deserializers = new List<object>();

        string Method1()
        {
            Command<string> cmd = new Command<string>();
            //var a = (T)Convert.ChangeType(cmd.Deserializer, typeof(T));
            this.deserializers.Add(cmd.Deserializer);
        }
        int Method2()
        {
            Command<int> cmd = new Command<int>();
            this.deserializers.Add(cmd.Deserializer);
        }

        void Execute()
        {
            string result = this.deserializers[0].Deserialize();
            int result2 = this.deserializers[1].Deserialize();
        }
    }
A类
{
列表反序列化器=新列表();
//或
//列表反序列化器=新列表();
字符串方法1()
{
Command cmd=new Command();
//var a=(T)Convert.ChangeType(cmd.Deserializer,typeof(T));
this.deserializers.Add(cmd.Deserializer);
}
int Method2()
{
Command cmd=new Command();
this.deserializers.Add(cmd.Deserializer);
}
void Execute()
{
字符串结果=此。反序列化程序[0]。反序列化();
int result2=this.deserializers[1]。反序列化();
}
}
编辑:

class A<T>
    {

        List<Deserializer<T>> deserializers = new List<Deserializer<T>>();

        string Method1()
        {
            Command<string> cmd = new Command<string>();
            var a = (Deserializer<T>)Convert.ChangeType(cmd.Deserializer, typeof(T));
            this.deserializers.Add(a);
            //return "";
        }
        int Method2()
        {
            Command<int> cmd = new Command<int>();
            var a = (Deserializer<T>)Convert.ChangeType(cmd.Deserializer, typeof(T));
            this.deserializers.Add(a);
            //return 0;
        }

        void Execute()
        {
            Node node1 = new Node();
            string result1 = (string)Convert.ChangeType(this.deserializers[0].Deserialize(node1), typeof(T));

            Node node2 = new Node();
            int result2 = (int)Convert.ChangeType(this.deserializers[1].Deserialize(node2), typeof(T));
        }
    }
A类
{
列表反序列化器=新列表();
字符串方法1()
{
Command cmd=new Command();
var a=(反序列化器)Convert.ChangeType(cmd.Deserializer,typeof(T));
此.deserializers.Add(a);
//返回“”;
}
int Method2()
{
Command cmd=new Command();
var a=(反序列化器)Convert.ChangeType(cmd.Deserializer,typeof(T));
此.deserializers.Add(a);
//返回0;
}
void Execute()
{
Node node1=新节点();
string result1=(string)Convert.ChangeType(此.deserializers[0]。反序列化(node1),typeof(T));
Node node2=新节点();
int result2=(int)Convert.ChangeType(this.deserializers[1]。反序列化(node2),typeof(T));
}
}

请再试一次,它是否可以帮助您

因此上述代码段不起作用?我不知道列表的一般类型应该是什么。我需要以某种方式删除该列表,否则它将是列表。您可以添加所有代码吗?因此,我需要实现相同的示例中最简单的方法是
List deserializers=new List()字符串结果=((反序列化器)this.deserializers[0]).Deserialize()
反序列化
方法中的
T
隐藏了
反序列化器
类定义中的
T
参数。你真正的代码有两个吗?非常感谢。这正是我需要的!!!我完全忘记了动态。但是仍然有一种方法可以使用
系统.Linq.Expressions
?有没有一种方法可以绕过编译时?@Bercovici Adrian,请查看编辑的部分回答可能对您有帮助:)使用
动态
是我想要的。您的第一个回答就是我需要的,因为我有一个反序列化程序的
列表,我不想使用条件。你的回答帮助我谢谢你,我接受了。很高兴听到你已经摆脱了你的问题:)
class A<T>
    {

        List<Deserializer<T>> deserializers = new List<Deserializer<T>>();

        string Method1()
        {
            Command<string> cmd = new Command<string>();
            var a = (Deserializer<T>)Convert.ChangeType(cmd.Deserializer, typeof(T));
            this.deserializers.Add(a);
            //return "";
        }
        int Method2()
        {
            Command<int> cmd = new Command<int>();
            var a = (Deserializer<T>)Convert.ChangeType(cmd.Deserializer, typeof(T));
            this.deserializers.Add(a);
            //return 0;
        }

        void Execute()
        {
            Node node1 = new Node();
            string result1 = (string)Convert.ChangeType(this.deserializers[0].Deserialize(node1), typeof(T));

            Node node2 = new Node();
            int result2 = (int)Convert.ChangeType(this.deserializers[1].Deserialize(node2), typeof(T));
        }
    }