getType与来自jObject的Integer与Integer不匹配

时间:2014-07-18 03:06:07

标签: c# linq json.net

我正在构建一个设置存储位,我最近从一大堆if-else迁移到了通用解决方案。但是,GetType解析器似乎在json中的第一个条目上失败,但其余的似乎都会通过。

现在,当我测试简化代码时,它们都不起作用。我把这个项目装入对象,但这是否意味着任何尝试拆箱都是JValue而不是基于JValue中的内容?

json是:

{
  "SectorSizePerSide": 10,
  "DefaultStellarPrefix": "ISC",
  "DefaultSystemPrefix": "UNKS",
  "DefaultSectorPrefix": "GS",
  "GridType": 3,
  "StellarDensity": 0.04,
  "MinimumStellarSeperation": 1.1,
  "MaxSizeOfSystemCatalog": 100000,
  "MaxSizeOfSectorCatalog": 50000,
  "MaxSizeOfStellarCatalog": 10000000,
  "AdditionalGeneration": 2,
  "LightYearResolution": 10,
  "TwoDMultiplication": 10,
  "AllowForSpaceOperaOverride": false,
  "InterstellarNebulaThreshold": 9999.03,
  "PlanetaryNebulaThreshold": .005,
  "AllowNegativeGrid" : false
}

编辑:这是代码被解析为的结构:

protected Dictionary<System.Enum, object> Properties = new Dictionary<System.Enum, object>();

我扩展了基类,所以我可以在这里指定Enum(这是PropertyName)。

至于简化代码,我很担心它的一部分是因为我使用的是倍数。但验证代码的一个标准示例是使用带有第一个参数的枚举的Dictionary,以及返回true / false的委托,并获取一个对象(使其成为通用的)。通常它在两个数字内,所以它调用一个比较它们的函数,在范围内返回true,否则返回false。

EDIT2:这是代码的修剪版本 - 没有原始验证控件,因为问题似乎不存在。

  private delegate bool ValidationDelegate(object o);

  var ourValidators = new Dictionary<PropertyName, ValidationDelegate>()
  {
      {PropertyName.StellarDensity, (o) => { if (o.GetType() == typeof(double)) return true; return false; }},
      {PropertyName.GridType, (o) => { if (o.GetType() == typeof(int)) return true; return false; }},
      {PropertyName.MinimumStellarSeperation, (o) => { if (o.GetType() == typeof(double)) return true; return false; }},
   }

   public void LoadProperties()
   {
         using (StreamReader sr = new StreamReader(base.FilePath))
         {
             JObject rawInput = JObject.Parse(sr.ReadToEnd());
             foreach (var entry in rawInput)
             {
               try
               {
                  PropertyName thisProperty = genHelper.parseEnum<PropertyName>(entry.Key);
                  if (ourValidators[thisProperty](entry.Value.Value<object>()))
                     this.Set(thisProperty, entry.Value.Value<object>());
                  else
                     settingInvalidSet<object>(thisProperty, ourDefaults[thisProperty]);

                 }
           }
      }

0 个答案:

没有答案