我正在构建一个设置存储位,我最近从一大堆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]);
}
}
}