从方法

时间:2015-07-23 23:27:04

标签: c# anonymous-types

有没有办法让函数返回我传入的对象类型?我想调用下面的一个方法来返回我传入的类型。这可能吗?我应该尝试这样做吗?有没有更好的方法......没有两种不同的方法?

目前,我尝试了前两个调用,然后我回来(第一次调用)看起来像是字典值部分中带有system.object []的字典。下面的屏幕截图可能比我的解释更好。我问这个问题,因为我可能有更多类型需要反序列化,并且不希望每个类型都有不同的方法。

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;
    }
}

创建对象:

enter image description here

1 个答案:

答案 0 :(得分:2)

是的,您可以创建一个通用方法。您的Deserialize()方法看起来像这样:

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;
}

在此示例中,T是一个类型参数。调用此方法时,您可以传递如下类型:

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

一方面注意:我不建议默默地吞咽异常。在这种情况下,预计反序列化可能会失败。因此,我会将其更改为TryDeserialize()方法:

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;
}