Вы можете использовать оператор is
для проверки типа. Тогда ваш метод будет выглядеть следующим образом:
public ResultStatus InsertDownload(object log)
{
if(log is UserLog userLog)
{
return glDb.UsersDownload(userLog);
}
else if(log is NonUserLog nonUserLog)
{
return glDb.NonUsersDownload(nonUserLog);
}
else
{
throw new ArgumentException("invalid type", nameof(log));
}
}
Если UserLog
и NonUserLog
имеют общий базовый класс, вы также можете использовать его вместо object
.
Но вы должен действительно подумать, улучшает ли это ваш код. Если вам приходится проверять тип и делать разные вещи в зависимости от типа, это часто является признаком плохого дизайна класса.
РЕДАКТИРОВАТЬ: Я только что видел ваш код модели. Они имеют единственное отличие в том, что у вашего UserLog
класса есть дополнительное свойство IsProfessional
. Возможно, вы могли бы объединить ваши классы в один, добавив дополнительное свойство IsUser
:
public class Log
{
public string CustomerId { get; set; }
public string FileName { get; set; }
public string Remote_Addr { get; set; }
public string Local_Addr { get; set; }
public string Http_User_Agent { get; set; }
public string Http_Referer { get; set; }
public bool? IsMobile { get; set; }
public int? DeviceId { get; set; }
public string AppType { get; set; }
public bool? IsProfessional { get; set; }
public bool IsUser { get; set; }
}
Тогда вы могли бы написать свою функцию следующим образом:
public ResultStatus InsertDownload(Log log)
{
if(log.IsUser)
{
return glDb.UsersDownload(log);
}
else
{
return glDb.NonUsersDownload(log);
}
}
Это дает то преимущество, что вы Может сигнатура метода более выразительна, чем метод, который принимает object
в качестве параметра.