Sicherung
This commit is contained in:
74
Config.Net/Core/DynamicReader.cs
Normal file
74
Config.Net/Core/DynamicReader.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Config.Net.Core.Box;
|
||||
|
||||
namespace Config.Net.Core
|
||||
{
|
||||
class DynamicReader
|
||||
{
|
||||
private readonly string? _basePath;
|
||||
private readonly IoHandler _ioHandler;
|
||||
|
||||
public DynamicReader(string? basePath, IoHandler ioHandler)
|
||||
{
|
||||
_basePath = basePath;
|
||||
_ioHandler = ioHandler;
|
||||
}
|
||||
|
||||
public object? Read(ResultBox rbox, int index = -1, params object[] arguments)
|
||||
{
|
||||
if (rbox is PropertyResultBox pbox) return ReadProperty(pbox, index);
|
||||
|
||||
if (rbox is ProxyResultBox xbox) return ReadProxy(xbox, index);
|
||||
|
||||
if (rbox is CollectionResultBox cbox) return ReadCollection(cbox, index);
|
||||
|
||||
if (rbox is MethodResultBox mbox) return ReadMethod(mbox, arguments);
|
||||
|
||||
throw new NotImplementedException($"don't know how to read {rbox.GetType()}");
|
||||
}
|
||||
|
||||
private object? ReadProperty(PropertyResultBox pbox, int index)
|
||||
{
|
||||
string path = OptionPath.Combine(index, _basePath, pbox.StoreByName);
|
||||
|
||||
return _ioHandler.Read(pbox.ResultBaseType, path, pbox.DefaultResult);
|
||||
}
|
||||
|
||||
private object ReadProxy(ProxyResultBox xbox, int index)
|
||||
{
|
||||
if (!xbox.IsInitialisedAt(index))
|
||||
{
|
||||
string prefix = OptionPath.Combine(index, _basePath, xbox.StoreByName);
|
||||
|
||||
xbox.InitialiseAt(index, _ioHandler, prefix);
|
||||
}
|
||||
|
||||
return xbox.GetInstanceAt(index);
|
||||
}
|
||||
|
||||
private object? ReadCollection(CollectionResultBox cbox, int index)
|
||||
{
|
||||
string lengthPath = OptionPath.Combine(index, _basePath, cbox.StoreByName);
|
||||
lengthPath = OptionPath.AddLength(lengthPath);
|
||||
|
||||
if (!cbox.IsInitialised)
|
||||
{
|
||||
int length = (int?)_ioHandler.Read(typeof(int), lengthPath, 0) ?? 0;
|
||||
|
||||
cbox.Initialise(_basePath, length, this);
|
||||
}
|
||||
|
||||
return cbox.CollectionInstance;
|
||||
}
|
||||
|
||||
private object? ReadMethod(MethodResultBox mbox, object[] arguments)
|
||||
{
|
||||
string path = mbox.GetValuePath(arguments);
|
||||
path = OptionPath.Combine(_basePath, path);
|
||||
|
||||
return _ioHandler.Read(mbox.ResultBaseType, path, mbox.DefaultResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user