我正在使用Chello(Trello API的c#包装器)。我需要根据以下文档传递参数“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;
}
答案 0 :(得分:3)
问题在于,您使用的API希望您传入的公共属性等于您要使用的标记。
使用Anonymous Types这很容易做到(我正在做一个稍微不同的例子来帮助说明一点)
//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();
答案 1 :(得分:1)
string
是object
。 .NET平台中的每种类型都继承自Object
。这称为Unified Type System。
另一方面,我们有Liskov Substitution Principle,简单地说,如果B是A的子类型(B是A),那么无论在哪里使用A,你都应该能够使用B.
基于这些原因,您可以将字符串传递给任何接受对象作为参数的方法。
你可以测试一下:
public void DoSomething(object args)
{
}
public void Main()
{
DoSomething("some string argument, instead of the object");
}
它运作得很好。没错。