Graeme_Grant
Расширяя решение Мехди Голама, вот реальный пример того, где метод ProcessFileType
"обнаруживает" тип данных, в которые он должен преобразовать, ищет тип данных, затем выполняет преобразование из строки JSON и возвращает структуру класса определенного типа.
// only some types are lists for briefity
private readonly Dictionary<string, Func<JObject, File>> mimeTypes
= new Dictionary<string, Func<JObject, File>>
{
{ "application/vnd.google-apps.folder", Convert<Folder>() },
{ "image/jpeg", Convert<JpgImage>() },
{ "image/png", Convert<PngImage>() },
{ "application/zip", Convert<Zipped>() },
{ "application/x-zip-compressed", Convert<Zipped>() },
{ "video/mp4", Convert<Mp4Video>() },
{ "text/plain", Convert<TxtDocument>() },
{ "application/vnd.openxmlformats-officedocument.presentationml.presentation",
Convert<PptDocument>() },
{ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
Convert<WordDocument>() }
};
// Convert file of type.... mimeTypes
private void ProcessFileType(List<File> results, IList<JObject> jObjs, int i)
{
var fileToken = jObjs[i].FindTokens("mimeType");
if (fileToken != null && fileToken.Count > 0)
{
var key = mimeTypes.Keys.FirstOrDefault(x => x.Equals(fileToken[0].ToString()));
if (key != null)
{
results.Add(mimeTypes[key](jObjs[i]));
}
}
}
// Convert Json Object data into a specified class type
private static Func<JObject, File> Convert<TModel>() where TModel : File
{
return (jObj) => JsonHelper.ToClass<TModel>(jObj.ToString());
}
Чтобы сделать точно то же самое медленнее, используя отражение, это будет выглядеть примерно так:
public JsonDataTypeConverter()
{
if (convert == null)
convert = GetType().GetMethod(nameof(Convert),
BindingFlags.Instance | BindingFlags.NonPublic);
}
private static MethodInfo convert; // configured on class instantiation
// only some types are lists for briefity
private static readonly Dictionary<string, Type> mimeTypes = new Dictionary<string, Type>
{
{ "application/vnd.google-apps.folder", typeof(Folder) },
{ "image/jpeg", typeof(JpgImage) },
{ "image/png", typeof(PngImage) },
{ "application/zip", typeof(Zipped) },
{ "application/x-zip-compressed", typeof(Zipped) },
{ "video/mp4", typeof(Mp4Video) },
{ "text/plain", typeof(TxtDocument) },
{ "application/vnd.openxmlformats-officedocument.presentationml.presentation",
typeof(PptDocument) },
{ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
typeof(WordDocument) }
};
// Convert file of type.... mimeTypes
private void ProcessFileType(List<File> results, IList<JObject> jObjs, int i)
{
var fileToken = jObjs[i].FindTokens("mimeType");
if (fileToken != null && fileToken.Count > 0)
{
var key = mimeTypes.Keys.FirstOrDefault(x => x.Equals(fileToken[0].ToString()));
if (key != null)
{
var method = convert.MakeGenericMethod(new[] { mimeTypes[key] });
var data = method.Invoke(this, new[] { jObjs[i] });
results.Add((File)data);
}
}
}
// Convert Json Object data into a specified class type
private TModel Convert<TModel>(JObject jObj) where TModel : IResourceKind
{
return JsonHelper.ToClass<TModel>(jObj.ToString());
}
Если вы хотите увидеть код в действии, вы можете скачать его из этой статьи:
Работа с JSON в C# и VB[
^] (Пример Google Drive - File Explorer)