我写了这个方法,它接受一个通用的参数对象。此方法接受具有不同属性的不同参数对象。这个想法是基于" MethodName"的价值。 property,我可以根据特定参数对象
的属性构造一个URI我使用反射来获取名为" MethodName的属性的值。"它不是一种方法,只是一个属性名称。
我在case语句中使用MethodName属性的值。这似乎是完成我的任务的一种低级方式。特别是随着MethodNames数量的增长。
以下是case语句实现的源代码。任何帮助将不胜感激。
public string ConstructBBAPIUri<T>(T parameters)
{
var methodName = "";
var uri = "";
var userId = "";
long timeStamp = 0;
var signature = "";
var sessionKey = "";
var newUserId = "";
if (parameters != null)
{
methodName = parameters.GetType().GetProperty("MethodName").GetValue(parameters, null).ToString();
switch (methodName)
{
case "user.login":
userId = parameters.GetType().GetProperty("UserId").GetValue(parameters, null).ToString();
timeStamp = Convert.ToInt64(parameters.GetType().GetProperty("TimeStamp").GetValue(parameters, null));
signature = GenerateBunchBallSignature(userId);
uri = "method=" + methodName + "&apiKey=" + apiKey + "&userid=" + userId + "&ts=" +
timeStamp + "&sig=" + signature;
break;
case "user.modifyUserId":
//We shouldn't need the session key if user.login is being called first
userId = parameters.GetType().GetProperty("UserId").GetValue(parameters, null).ToString();
newUserId = parameters.GetType().GetProperty("NewUserId").GetValue(parameters, null).ToString();
uri = "method=" + methodName + "&sessionKey=" + sessionKey + "&oldUserId=" + userId +
"&newUserId=" + newUserId;
break;
}
}
return uri;
}
答案 0 :(得分:4)
更好的设计是委托在类上构造URI。
答案 1 :(得分:0)
一个选项是将函数添加到字典中,但我没有看到它比当前方法更好,而且会更容易混淆和容易出错。
我认为Max Shmelev所暗示的将是最好的解决方案。如果可以,请为将要传递的每个类添加一个接口,并为此方法添加一个通用约束。该接口将定义一个方法,当在对象中实现时,将处理该对象的序列化。
如果列表不是太长,你可以为每个不同的类型添加方法来处理,并且在每种情况下只需要一个方法调用。