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