想象一下,我有3个不同的System.Serializable
类,让它们放在一行/类中:
[System.Serializable] public class ClassA { public string xx; }
[System.Serializable] public class ClassB { public int yy; }
[System.Serializable] public class ClassC { public bool zz; }
以下是我想要制作的功能(代码不正在运作):
void MyConvertFunction(
[System.Serializable] MyClassType,
string astring_toconvert
) {
MyClassType j = null;
j = JsonUtility.FromJson<MyClassType>(astring_toconvert);
Debug.Log(j);
}
MyConvertFunction(ClassA, "thestring");
MyConvertFunction(ClassB, "1548");
MyConvertFunction(ClassC, "true");
上面的代码不正在运作,有没有办法让它发挥作用?
答案 0 :(得分:3)
使用泛型可以做到这一点。我有一种感觉,你也希望返回的转换回到你使用JsonUtility.FromJson
函数时传入的那种类型。只需使MyConvertFunction
函数返回泛型,然后使用Convert.ChangeType
函数进行转换。我将介绍两者。
你的班级:
[System.Serializable]
public class ClassA { public string xx; }
[System.Serializable]
public class ClassB { public int yy; }
[System.Serializable]
public class ClassC { public bool zz; }
通用转换函数
T MyConvertFunction<T>(string astring_toconvert)
{
object resultValue = JsonUtility.FromJson<T>(astring_toconvert);
//Convert back to the type of object passed into it
return (T)Convert.ChangeType(resultValue, typeof(T));
}
<强> USAGE 强>:
ClassA classA = MyConvertFunction<ClassA>("thestring");
ClassB classB = MyConvertFunction<ClassB>("1548");
ClassC classC = MyConvertFunction<ClassC>("true");
答案 1 :(得分:0)
你想要那样的东西;
ClassA
我建议您为ClassB
,ClassC
,pstmt.setLong(1, id);
创建一个界面或基类。因为您可能希望转换返回的反序列化对象。
答案 2 :(得分:0)
如果要使用JSON转换,示例中的格式是错误的。
"thestring"
无法转换为ClassA,正确的JSON格式为{"xx": "thestring"}
。
因此,如果您可以更改输入,那么Rainman的答案就可以了。
如果你无法改变输入,那么必须得到&#34; thestring&#34;或&#34; 123&#34;要转换为ClassA或ClassB,那么你需要跳过一些箍:
void MyConvertFunction(Type type, string astring_toconvert)
{
var inst = Activator.CreateInstance(type); // create an instance of your class
var prop = type.GetProperties().First(); // find the property we need to set
var convertedValue = Convert.ChangeType(astring_toconvert, prop.PropertyType); // convert the string to the correct type, throwing an exception if can't convert
prop.SetValue(inst, convertedValue);
Debug.Log(inst);
}
请注意,这仅适用于您的课程中只有一个属性的情况。如果您有多个,则必须提供正确的JSON输入。