如何将类型传递给反序列化的通用方法

时间:2017-02-27 20:12:47

标签: c# asp.net generics xamarin

我想将字符串和类型传递给泛型方法并尝试反序列化。这就是我所拥有的:

public static T DeserializeObject<T>(string value, Type type)
{
    T result = default(T);

    try
    {
        result = JsonConvert.DeserializeObject<type>(value);
        System.Diagnostics.Debug.WriteLine($"\nDeserialization Success! : { result }\n");

    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine($"\nDeserialization failed with exception : { ex }\n");
    }

    return result;
}

我尝试调用'GroupObject'是我想要返回的类型的方法:

var deserialized = Core.Deserializer.DeserializeObject(value: response, type: GroupObject);

导致错误:

Error CS0119: Expression denotes a `type', where a `variable', `value' or `method group' was expected (CS0119)

是否可以这样做?

4 个答案:

答案 0 :(得分:4)

您的方法不使用type变量。

此外,要使用类型参数调用方法,请使用typeof函数:

var deserialized = Core.Deserializer.DeserializeObject(value: response, type: typeof(GroupObject));

当然,您在这里没有提供太多信息,但根据我的经验,您正在寻找更像这样的方法:

public static T DeserializeObject<T>(string value)
{
    T result = default(T);
    try {
        result = JsonConvert.DeserializeObject<T>(value);
    }
    return result;
}

被称为:

var deserialized = Core.Deserializer.DeserializeObject<GroupObject>(value: response);

答案 1 :(得分:1)

如果我理解正确的话,你根本不需要type参数。你已经有了一个通用的,可以做到

GroupObject deserialized = Core.Deserializer.DeserializeObject<GroupObject>(response)

这也适用于任何其他类,例如

Foo foo = Core.Deserializer.DeserializeObject<Foo>(response)

P.S。我实际上并没有看到您type

答案 2 :(得分:0)

你根本没有在方法中使用参数type。您实际上并不需要该参数。您可以从方法中删除该参数。

方法并尝试反序列化。这就是我所拥有的:

public static T DeserializeObject<T>(string value)
{
    T result = default(T);

    try
    {
        result = JsonConvert.DeserializeObject<T>(value);
                System.Diagnostics.Debug.WriteLine($"\nDeserialization Success! : { result }\n");
    }
    catch (Exception ex)
    {
      System.Diagnostics.Debug.WriteLine($"\nDeserialization failed with exception : { ex }\n");
    }

    return result;
}

答案 3 :(得分:-1)

这是我的解决方案:

public static T DeserializeObject<T>(string inputString)
{
    T result = default(T);

    using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(inputString)))
    {
        try
        {
            var serializer = new DataContractJsonSerializer(typeof(T));

            result = (T)serializer.ReadObject(ms);

            WriteLine($"\nDeserialization Success : { result }\n");
        }
        catch (Exception ex)
        {
            WriteLine($"\nDeserialization Failed With Exception : { ex }\n");
        }
    }

    return result;
}   

'type'包含在方法调用中:

var deserialized = Core.Deserializer.DeserializeObject<GroupObject>(value: response);