Как передать строку функции, требующей объекта?

Я использую Chello (оболочку С# для API Trello). Мне нужно передать аргумент «createCard» в соответствии с документацией здесь: https://trello.com/docs/api/card/index.html

И это функция, которую я использую от Chello:

public IEnumerable<CardUpdateAction> ForCard(string cardId, object args)
    {
        string queryString = BuildQueryString(args);

        return GetRequest<List<CardUpdateAction>>("/cards/{0}/actions?{1}", cardId, queryString);
    }

Я попытался вызвать это таким образом:

 List<CardUpdateAction> cua = chello.CardUpdates.ForCard("5264d37736695b2821001d7a","createCard").ToList();

но получаю сообщение об ошибке: Несоответствие количества параметров

по этой функции:

 protected static string BuildQueryString(object args)
    {
        string queryString = String.Empty;
        if (args != null)
        {
            StringBuilder sb = new StringBuilder();
            foreach (var prop in args.GetType().GetProperties())
            {
                sb.AppendFormat("{0}={1}&", prop.Name, prop.GetValue(args, null));
            }
            if (sb.Length > 0) sb.Remove(sb.Length - 1, 1);
            queryString = sb.ToString();
        }
        return queryString;
    }

person Ben    schedule 16.11.2013    source источник


Ответы (2)


Проблема заключается в том, что ваш API, который вы используете, ожидает, что вы передадите класс, который имеет общедоступные свойства, равные тегам, которые вы хотите использовать.

Это очень легко сделать с помощью анонимных типов (я делаю немного другой пример, чтобы проиллюстрировать точку)

//This will cause BuildQueryString to return "actions=createCard&action_fields=data,type,date"
var options = new { actions = "createCard", action_fields = "data,type,date" };

List<CardUpdateAction> cua = chello.CardUpdates.ForCard("5264d37736695b2821001d7a",options).ToList();
person Scott Chamberlain    schedule 16.11.2013

string это object. Каждый тип на платформе .NET наследуется от Object. Это называется Единая система типов.

С другой стороны, у нас есть принцип подстановки Лисков, который ставит просто говорит, что если B является подтипом A (B есть A), то вы должны иметь возможность использовать B везде, где используется A.

По этим причинам вы можете передавать строку любому методу, который принимает объект в качестве аргумента.

Вы можете проверить это:

public void DoSomething(object args)
{
}

public void Main()
{
    DoSomething("some string argument, instead of the object");
}

Это работает просто отлично. Нет ошибок.

person Saeed Neamati    schedule 16.11.2013