存储多态(通过模板特化)对象的集合
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()
方法
只需列出 dynamic
或 object
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));
}
}
试试看对你有帮助
我有以下问题。我有一个通用 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()
方法
只需列出 dynamic
或 object
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));
}
}
试试看对你有帮助