是否可以使用类类型参数进行转换

时间:2017-12-16 10:29:06

标签: c# unity3d

想象一下,我有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");

上面的代码正在运作,有没有办法让它发挥作用?

3 个答案:

答案 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

我建议您为ClassBClassCpstmt.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输入。