Wannabe
Wannabe

Reputation: 596

Return typed object from method

Is there a way to make a function return the type of object I pass in? I would like to call the one method below to return the type I pass in. Is that possible? Should I even be trying to do this? Is there a better way...short of having two different methods?

Currently, I tried the first two calls and I get back (with the first call) what looks like a dictionary with a system.object[] in the value part of the dictionary. Screen shot below might show it better than my explanation. I ask this as I might have more types that I need to deserialize and don't want to have a different method for each.

var firstTry = this.Deserialize(path, typeof(ObservableCollection<ListItemPair>();

var secondTry = this.Deserialize(path, typeof(ListItemPair));

var thirdTry = this.Deserialize(path, typeof(SomeOtherObject));

public static object Deserialize(string jsonFile, object type)
{
    var myObject = new object();

    try
    {
        using (StreamReader r = new StreamReader(jsonFile))
        {
            var serializer = new JavaScriptSerializer();

            string json = r.ReadToEnd();

            myObject = serializer.Deserialize<object>(json);
        }
    }
    catch (Exception ex)
    {
    }

    return myObject ;
}

public class ListItemPair
{
    public string Name
    {
        get;

        set;
    }

    public object Value
    {
        get;

        set;
    }
}

object created:

enter image description here

Upvotes: 0

Views: 76

Answers (1)

Elian Ebbing
Elian Ebbing

Reputation: 19057

Yes, you can create a generic method. Your Deserialize() method would look something like this:

public static T Deserialize<T>(string jsonFile)
{
    T myObject = default(T);

    try
    {
        using (var r = new StreamReader(jsonFile))
        {
            var serializer = new JavaScriptSerializer();
            string json = r.ReadToEnd();
            myObject = serializer.Deserialize<T>(json);
        }
    }
    catch (Exception ex)
    {
    }

    return myObject;
}

In this example T is a type parameter. When invoking this method, you can pass the type like this:

var firstTry = Deserialize<ObservableCollection<ListItemPair>>(path);
var secondTry = Deserialize<ListItemPair>(path);
var thirdTry = Deserialize<SomeOtherObject>(path);

One side note: I wouldn't recommend silently swallowing an exception. In this case, it is expected that the deserialization can fail. Therefore, I would change it to a TryDeserialize() method:

public static bool TryDeserialize<T>(string jsonFile, out T myObject)
{
    try
    {
        using (var r = new StreamReader(jsonFile))
        {
            var serializer = new JavaScriptSerializer();
            string json = r.ReadToEnd();
            myObject = serializer.Deserialize<T>(json);
        }
    }
    catch (Exception ex)
    {
        myObject = default(T);
        return false;
    }

    return true;
}

Upvotes: 2

Related Questions