您好,这是我的第一篇文章,如果我做错了什么,请不要努力:D
我正在为一个大型程序编写DeSerializer, 为此,我有一个自己的班级
public class DeSerializeableElement
{
public Func<Object> action;
public Type type;
public DeSerializeableElement( Func<Object> p_action,Type p_type)
{
type = p_type;
action = p_action;
}
我读了一个字符串然后它始终以0XXX开头一个4位数字。 有了这个号码,我就从我的
中得到了正确的方法Dictionary<int,DeSerializableElement>
字典的初始化是自动生成的并且有300个元素
deSerializableObjectDictionary.Add(276, new DeSerializeableElement(GetString, typeof(System.String)));
GetString是一个没有参数的方法,返回一个String
现在我的问题是,如果我反序列化一个List,那么在我创建一个DeSerializableElement时,Func会丢失它的返回值Information。因为我把它保存为Func所以我得到了一个List 但是在GetString的情况下获取List非常重要 还有GetInt或GetDouble以及更多
所以如果我调用GetList(GetString)我想要一个List作为返回值 如果我调用GetList(GetInt)我想要一个List等等。 但我总是得到一个List,因为我的SerializableElement有Func作为属性
对GetList的调用类似于
GetList(deSerializableObjectDictionary[objectIdent].action);
GetList看起来像
public IList<T> GetList<T>(Func<T> p_action) //T is always Object because of Func<Object> here I the right Type
{
IList<T> list = new List<T>();
ExpectToken('['); //The start Token of a serialized List
while (!IsNextToken(']')) //End Token of serialized List
{
list.Add(p_action());
}
return lst;
}
答案 0 :(得分:0)
您选择的任何道路,都会导致您失去类型安全。例如,您可以推迟Dictionary<int, object>
并使用GetList<T>
方法将其换行,其中T
是您想要的实际类型。错误使用此方法可能会导致运行时异常。
一个例子是:
void Main()
{
var idToFunc = new Dictionary<int, object>();
idToFunc.Add(1, new DeSerializeableElement<int>(() => 1));
Console.WriteLine(GetList<int>(((DeSerializeableElement<int>) idToFunc[1]).Func));
}
public class DeSerializeableElement<T>
{
public Func<T> Func { get; set; }
public DeSerializeableElement(Func<T> func)
{
Func = func;
}
}
我肯定会冒这种代码所涉及的风险。虽然可能,但我建议你重新考虑一下你正在做什么以及你的解串器的架构。