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

时间:2018-08-01 13:16:04

标签: c# polymorphism template-specialization

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

library(rjson)
library(magrittr)

df<-mtcars[1:4,1:4]

apply(df, 1, toJSON) %>% 
  setNames(paste0("Car: ", names(.), "\n")) %>% 
  gsub("(\\{|\\})", "", .) %>%  # Remove braces
  gsub(",\"", "\n", .) %>%      # replace ," with line break
  gsub("\"", "", .) %>%         # replace double quotations (could be problematic if you have text data with double quotes)
  gsub("[:]", ": ", .) %>%      # add a space after colons
  paste0(names(.), .) %>%       # put the name of the car above its data
  paste0(collapse = "\n\n") %>% # bring them into one string
  cat()

想象一下,现在我有一个类,该类具有创建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(); } } 的方法。我想以某种方式将此Command<T>专用字段存储在数据结构中,以便以后可以检索并使用Deserializer方法。

Deserialize

1 个答案:

答案 0 :(得分:1)

您可以使用以下代码访问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));
        }
    }

尝试一次可能对您有帮助