gpt4 book ai didi

c# - 我如何从 Func 转换为 Func c#
转载 作者:行者123 更新时间:2023-11-30 18:21:10 24 4
gpt4 key购买 nike

你好,这是我的第一篇文章,如果我做错了什么,请不要太难过:D

我正在为一个大程序写一个 DeSerializer,为此,我有自己的类(class)

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

现在我的问题是,如果我反序列化一个列表,在我创建一个 DeSerializableElement 的那一刻,Func 丢失了它的返回值信息。因为我将它保存为 Func 所以我得到了一个列表但在 GetString 的情况下获取列表很重要还有 GetInt 或 GetDouble 等等

所以如果我调用 GetList(GetString) 我想要一个 List 作为返回值如果我调用 GetList(GetInt) 我想要一个 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;
}

最佳答案

您选择的任何一条道路都会使您失去类型安全性。例如,您可以推迟到 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;
}
}

我肯定知道这种代码所涉及的风险。虽然可能,但我建议您重新考虑您正在做的事情以及您的反序列化器的架构。

关于c# - 我如何从 Func<Object> 转换为 Func<dynamicType> c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36029717/

24 4 0