Связывание переменной с классом в C # (для JSON) - PullRequest
0 голосов
/ 29 июля 2010

Мне нужно получить JSON, предоставленный API, для моего проекта, а это означает десериализацию JSON с использованием класса, и я решил использовать классы DataContract.В любом случае разные URL-адреса соответствуют разным выходным данным JSON для API.

Так что я спрашиваю?Чтобы увидеть, есть ли лучший способ иметь URL-адреса, соответствующие классам DataContract, чем создавать public T GetObject<T>(string uri) и использовать его с GetObject<ExampleDataContract>("http://blah/").

В приведенном ниже коде показана моя текущая попытка, которую я 'Я думаю, что это не очень хорошая идея, не говоря уже о том, что, если я когда-нибудь поменяю пространство имен, мне будет весело.

    public T GetObject<T>()
    {
        string uri = "";
        string type = typeof(T).ToString();
        switch (type)
        {
            case "Namespace.ExampleDataContract":
                uri = "http://www.example.com/blah.json";
                break;
        }

        return JsonHelper.Deserialize<T>(this.GetJson(uri));
    }

1 Ответ

1 голос
/ 29 июля 2010

Я вижу одну проблему с вашим подходом: что если у вас есть два разных URL, оба возвращают ExampleDataContract? Используя ваш метод, вы сможете получить только один из них, так как тип однозначно определяет URL.

В любом случае, вы правы, что избавление от магической струны "Namespace.ExampleDataContract" - хорошая идея. Использование if является одним из вариантов, более подробно показано в SO вопросах 708911 и 298976 .

public T GetObject<T>()
{
    string uri = "";
    if (typeof(T) == typeof(Namespace.ExampleDataContract))
    {
        uri = "http://www.example.com/blah.json";
    }
    else if (typeof(T) == ...)
    {
        ...
    }
    else
    {
        ... // throw some exception
    }

    return JsonHelper.Deserialize<T>(this.GetJson(uri));
}
...