I'm making a game with Unity's C#.
A 64-bit C++ build called IL2CPP has led to no reflection.
without reflection when creating API communications
in a unique class that inherits the response class on which API received data is based.
I had to cast it, and I couldn't do it, so I chose the test class
I was going to make it, but I don't know how to do it, so I'm worried.
There are the following classes.
·Basic Class A
·Class B and C
that inherited A
·JsonTestManager test class to serialize and de-serialize LitJson
·OnDebug calling class
When OnClickButton in OnDebug runs
Data is created in ClassB and ClassC and
I purposely put the data in a ClassA buffer in JsonTestManager.
I would like to specify the type of inheritance destination in the following part, but I don't know what to do.
With Unity, it's up to C#3.0, so Dynamic is not available, and reflection is no longer available.
When the response type of the inheritance destination has changed, it cannot be dealt with.
testClassCC=LitJson.JsonMapper.ToObject<Inherited Type>(str);
■ ClassA
using UnityEngine;
using System.Collections;
public class ClassA
{
public int aaa;
public int bbb;
}
■ ClassB
using UnityEngine;
using System.Collections;
public class ClassB —ClassA
{
public string test1;
public string test2;
}
■ ClassC
using UnityEngine;
using System.Collections;
public class ClassC —ClassA
{
public string test3;
public string test4;
}
■JsonTestManager
using UnityEngine;
using System.Text;
using System.Collections;
usingLitJson;
public class JsonTestManager
{
publicClassAtestClassB;
public ClassA testClassC;
public ClassA testClassCC;
public void JsonTest()
{
// Convert data to JsonString for transmission
string litjsonString=LitJson.JsonMapper.ToJson(testClassC);
byte[] postBytes=Encoding.Default.GetBytes(litjsonString);
string str = Encoding.UTF8.GetString(postBytes);
testClassCC = LitJson.JsonMapper.ToObject<Inherited Type>(str);
}
}
■ Calling Class OnDebug -- Tap the button to call OnClickButton().
using UnityEngine;
using System.Collections;
public class OnDebug
{
public JsonTestManager jsonTestManager = new JsonTestManager();
public void OnClickButton()
{
ClassB classB = new ClassB();
classB.test1 = "test1";
classB.test2 = "test2";
ClassC classC = new ClassC();
classC.test3 = "test3";
classC.test4 = "test4";
jsonTestManager.testClassB=classB;
jsonTestManager.testClassC=classC;
jsonTestManager.testClassCC=classC;
jsonTestManager.JsonTest();
}
}
The generic class generic method type parameters must be determined at compile time, so you cannot dynamically specify a type, such as a Type, unless you use reflection.
However, if you don't need to change the type at runtime, and you want to be able to decide the type from the person who uses JsonTestManager
, you can solve it by making it generic for each JsonTestManager
.
If you rewrite the code written in the question using generic, would this be what it looks like?
public class JsonTestManager<T1,T2,T3>
{
public T1 testClassB;
public T2testClassC;
public T3testClassCC;
public void JsonTest()
{
string litjsonString=LitJson.JsonMapper.ToJson(testClassC);
// Shouldn't it be unified into either Default or UTF8?
byte[] postBytes=Encoding.Default.GetBytes(litjsonString);
string str = Encoding.UTF8.GetString(postBytes);
testClassCC = LitJson.JsonMapper.ToObject<T3>(str);
}
}
public class OnDebug
{
public void OnClickButton()
{
ClassB classB = new ClassB();
classB.test1 = "test1";
classB.test2 = "test2";
ClassC classC = new ClassC();
classC.test3 = "test3";
classC.test4 = "test4";
varjsonTestManager = new JsonTestManager <ClassB, ClassC, ClassC>();
jsonTestManager.testClassB=classB;
jsonTestManager.testClassC=classC;
jsonTestManager.JsonTest();
}
}
If it's just "convert testClassB to JSON and return it back to the object" (I deleted it because it doesn't seem to be approximately .
Alternatively, if ToObject<T>()
is all you need to do, you can leave the field ClassA
and pass the type parameter to ToObject<T>()
to JsonTest()
.This is easier if you want to use singleton or use instances around.
public class JsonTestManager
{
publicClassAtestClassB;
public ClassA testClassC;
public ClassA testClassCC;
public void JsonTest<Tresult>()
{
string litjsonString=LitJson.JsonMapper.ToJson(testClassC);
byte[] postBytes=Encoding.Default.GetBytes(litjsonString);
string str = Encoding.UTF8.GetString(postBytes);
testClassCC = LitJson.JsonMapper.ToObject<Tresult>(str);
}
}
public class OnDebug
{
public JsonTestManager jsonTestManager = new JsonTestManager();
public void OnClickButton()
{
ClassB classB = new ClassB();
classB.test1 = "test1";
classB.test2 = "test2";
ClassC classC = new ClassC();
classC.test3 = "test3";
classC.test4 = "test4";
jsonTestManager.testClassB=classB;
jsonTestManager.testClassC=classC;
jsonTestManager.JsonTest<ClassC>();
// Field type is ClassA, so cast is required to treat it as a derivative
varclassCC=(ClassC)jsonTestManager.testClassCC;
}
}
916 When building Fast API+Uvicorn environment with PyInstaller, console=False results in an error
620 Uncaught (inpromise) Error on Electron: An object could not be cloned
574 Who developed the "avformat-59.dll" that comes with FFmpeg?
573 rails db:create error: Could not find mysql2-0.5.4 in any of the sources
© 2024 OneMinuteCode. All rights reserved.