如何从Func <object>转换为Func <dynamictype> c#

时间:2016-03-16 07:55:15

标签: c# generics delegates

您好,这是我的第一篇文章,如果我做错了什么,请不要努力: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;
}

1 个答案:

答案 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;
    }
}

我肯定会冒这种代码所涉及的风险。虽然可能,但我建议你重新考虑一下你正在做什么以及你的解串器的架构。