存储多态(通过模板特化)对象的集合

Storing collection of Polymorphic (via template specialization) objects

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

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,它具有创建 Command<T> 的方法。我想以某种方式将这个 Deserializer 专用字段存储在一个数据结构中,稍后我可以在其中检索并使用 Deserialize 方法。

class A
{    
    List<something`>deserializers=new List<something>();

    string Method1()
    {
        ....
        Command<string> cmd;
        this.deserializers.Add(cmd.Deserializer);
        ....
    }

    int Method2()
    {
        Command<int> cmd;
        this.deserializers.Add(cmd.Deserializer);
        .....
    }    

....at some point i want to:

void Execute()
{
    string result=this.deserializers[0].Deserialize();
    int result2=this.deserializers[1].Deserialize();
}

您可以使用以下代码

访问您的 Deserialize() 方法

只需列出 dynamicobject

 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();
        }
    }

编辑:

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));
        }
    }

试试看对你有帮助