c#动态类型正确用法

如何解决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; }
}

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 的模拟

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?