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 vs 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, transactionsFromDateTimeTicks, transactionsToDateTimeTicks, tmp.bookmakerId);

昨天我没有完全理解。我需要澄清一些事情,你想在初始化tmp变量后实现什么。你想传递int或者long或者dynamic?我不能理解这种情况,但如果你想使用动态,我建议这样实现。

为了更好地理解,我做了一些注释。

创建抽象类

public abstract class User
{
public string ErrorCode { get; set; }
public dynamic UserId { get; set; }
}

SportsUserSportsAdminUser将继承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的mock

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方法仍然必须处理动态类型(最后一个参数)

希望有帮助

最新更新