【问题标题】:Forcing a Class to have a .Parse Method强制一个类有一个 .Parse 方法
【发布时间】:2018-12-12 05:51:32
【问题描述】:

TLDR 问题:

如何将字符串转换为特定类型的对象?

长问题

我想制作一个 PlayerPrefs 包装器,我可以在其中存储我想要的任何数据。

原来是这样的

void Set<T>(string Key, T Value)
{
   PlayerPrefs.SetString(Key, Value.ToString());
}

T Get<T>(string Key)// where T : IParseable
{
    //Code that checks for errors and throws exceptions
    return T.Parse(PlayerPrefs.GetString(Key));
}

这里的问题是它“依赖”数据是可解析的(或实现我发明 XD 的 IParseable)并且原始数据类型没有实现它,即使它们都有 Parse 方法

  1. 是否已有可以使用的IParseable 接口?

  2. 如果不是,有没有办法知道T类型是否是原始数据类型?

  3. 有没有更好的方法来实现我想做的事情?

  4. 如果我为此使用 JSON 会更好吗?

【问题讨论】:

  • 2) - typeof(IConvertible).IsAssignableFrom(typeof(T)) 4) - 是的,序列化/反序列化而不是 .ToString() / Parse()
  • 不要重新发明轮子你自己的“IParsable”。您要寻找的是序列化/反序列化。不过,不确定 Unity3D 带有什么(反)序列化器。您应该做的是使用(您选择的)序列化程序将数据(对象)序列化为某种文本表示形式。与您选择的序列化程序关联的相应反序列化程序可用于将该文本表示反序列化回对象。我喜欢/想要 Json,考虑使用 Json.NET(再次,不确定它是否可用于 Unity3D/Mono)

标签: c# unity3d .net-2.0


【解决方案1】:

cmets 是正确的,您不应该使用 ToString() 和 Parse。你正在做(或试图做)的是序列化。这里有一些资源可以用来确定如何序列化和反序列化您的数据:

如果您使用上述示例之一,则应将数据序列化为人类可读的格式。它的效率较低,但序列化为字符串的效率已经低于序列化为字节的效率。如果您需要这种级别的效率,则不应使用 PlayerPrefs。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多