如何解决c#动态类型正确用法
public class SportsUser
{
public string errorCode { get; set; }
//the sportsuser and SportsAdminUser is from a different database hence the long and int difference
public long userId { get; set; }
...
}
public class SportsAdminUser
{
public int userId { get; set; }
public string errorCode { get; set; }
...
}
我还有一个 web api 调用,它可以传递 sessiontoken 或用户名和密码,以确定我需要实例化上面的哪个类。
...
UserHandler userHandler = new UserHandler();
string errorCode = "";
int adminId = 0;
if (!string.IsNullOrEmpty(sessionToken))
{
SportsUser sportsUser = new SportsUser();
sportsUser = userHandler.CheckUpdateUserSessionToken(sessionToken);
adminId = Convert.ToInt32(sportsUser.userId);
errorCode = sportsUser.errorCode;
}
else
{
SportsAdminUser sportsAdminUser = new sportsAdminUser();
sportsAdminUser = userHandler.LoginUser(username,password);
adminId = sportsAdminUser.userId;
errorCode = sportsAdminUser.errorCode;
}
if (errorCode != "SESSION_INVALID" && errorCode != "INVALID_CREDENTIALS" && errorCode != "ACCOUNT_LOCKED")
{
Tuple<int,List<PunterTransaction>> resultTupe = businessLogic.GetCustomerTransactions(customerId,transactionsFromDateTimeTicks,transactionsToDateTimeTicks,adminId);
...
为了使这个更干净,我尝试使用如下动态,但 userid 属性是 long 与 int 取决于使用哪个类。我该如何解决这个问题,在这种情况下是否可以使用动态?谢谢。
UserHandler userHandler = new UserHandler();
dynamic tmp = new System.Dynamic.ExpandoObject();
if (!string.IsNullOrEmpty(sessionToken))
{
tmp = userHandler.CheckUpdateUserSessionToken(sessionToken);
}
else
{
tmp = userHandler.LoginUser(username,password);
}
if (tmp.errorCode != "SESSION_INVALID" && tmp.errorCode != "INVALID_CREDENTIALS" && tmp.errorCode != "ACCOUNT_LOCKED")
{
Tuple<int,List<CustomerTransaction>> resultTupe = businessLogic.GetCustomerTransactions(customerId,tmp.bookmakerId);
解决方法
昨天我没有正确理解。我需要澄清一些事情,你想在 tmp
变量初始化后实现什么。您想传递 int 或 long 还是动态?
我无法理解这种情况,但如果你想使用动态,我建议像这样实现它。
为了更好地理解,我发表了一些评论。
创建抽象类
public abstract class User
{
public string ErrorCode { get; set; }
public dynamic UserId { get; set; }
}
类 SportsUser
和 SportsAdminUser
将继承 User
public class SportsUser : User
{
}
public class SportsAdminUser : User
{
}
用法:
UserHandler userHandler = new UserHandler();
string sessionToken = "something";
string username = "user";
string password = "password";
User tmp;
if (!string.IsNullOrEmpty(sessionToken))
{
tmp = userHandler.CheckUpdateUserSessionToken("sessionToken");
}
else
{
tmp = userHandler.LoginUser(username,password);
}
//For testing type
var sportsUserTestType = userHandler.CheckUpdateUserSessionToken("sessionToken").UserId.GetType(); //int
var sportsAdminUserTestType = userHandler.LoginUser(username,password).UserId.GetType(); // long
if (tmp.ErrorCode != "SESSION_INVALID" && tmp.ErrorCode != "INVALID_CREDENTIALS" &&
tmp.ErrorCode != "ACCOUNT_LOCKED")
{
Tuple<int,List<string>> resultTupe = businessLogic.GetCustomerTransactions(customerId,transactionsFromDateTimeTicks,transactionsToDateTimeTicks,tmp.UserId);
}
我对 UserHandler 的模拟
public class UserHandler
{
public SportsUser CheckUpdateUserSessionToken(string sessionToken)
{
//Do something
return new SportsUser()
{
ErrorCode= "error1",UserId = 1 //int
};
}
public SportsAdminUser LoginUser(string username,string password)
{
//Do something
return new SportsAdminUser()
{
ErrorCode = "error2",UserId = 2L // long
};
}
}
注意 GetCustomerTransactions
方法仍然需要处理动态类型(最后一个参数)
希望有帮助
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。