Результаты вызова API в System.InvalidCastException: указанное приведение недопустимо

#c# #xamarin #xamarin.forms #mvvmcross

#c# #xamarin #xamarin.forms #mvvmcross

Вопрос:

У меня есть метод, который получает список сотрудников из API, а затем сохраняет их в ObservableCollection для отображения в ListView. Однако мне не повезло, поскольку я продолжаю получать эту ошибку «System.InvalidCastException: указанное приведение недопустимо «.

Я думал, что это список, но, к моему удивлению, даже удаление назначения все равно привело к сбою приложения. Что мне показалось интересным, так как после завершения и var employees заполнения API код будет возвращаться к закрывающей фигурной скобке вызова API, прежде чем возвращать указанную ошибку. Любая помощь приветствуется. Пожалуйста, посмотрите мой код ниже:

ViewModel

 public class EmployeeListViewModel : BaseViewModel
{
    private IUserService _userService { get; set; }
    public EmployeeListViewModel(IUserService userService)
    {
        _userService = userService;
        GetEmployees();
    }

    private async void GetEmployees()
    {
        var employees = await _userService.GetEmployees();
        Employees = new MvxObservableCollection<User>(employees);
    }

    private MvxObservableCollection<User> _employees;
    public MvxObservableCollection<User> Employees
    {
        get => _employees;
        set { SetProperty(ref _employees, value); }
    }
}
 

Обслуживание

 public async Task<List<User>> GetEmployees()
{
    string url = $"{IpAddress}/{_controllerRoute}/getemployees";
    var content = await _httpClient.GetStringAsync(url);
    return JsonConvert.DeserializeObject<List<User>>(content);
}
 

Модель

 public class User
//Simply copying IdentityUser, as this is the object being returned from the server
{
    public virtual string Id { get; set; }
    public virtual string UserName { get; set; }
    public virtual string NormalizedUserName { get; set; }
    public virtual string Email { get; set; }
    public virtual string NormalizedEmail { get; set; }
    public virtual bool EmailConfirmed { get; set; }
    public virtual string PasswordHash { get; set; }
    public virtual string SecurityStamp { get; set; }
    public virtual string ConcurrencyStamp { get; set; }
    public virtual string PhoneNumber { get; set; }
    public virtual bool PhoneNumberConfirmed { get; set; }
    public virtual bool TwoFactorEnabled { get; set; }
    public virtual DateTime? LockoutEnd { get; set; }
    public virtual bool LockoutEnabled { get; set; }
    public virtual int AccessFailedCount { get; set; }
}
 

Комментарии:

1. пожалуйста, обратите внимание, что, хотя это вопрос с измененной формулировкой, администраторы посоветовали мне повторно использовать удаленные вопросы, чтобы избежать запрета задавать их. Спасибо за ваше терпение и ответы.

2. Какие строки вызывают исключение и можете ли вы опубликовать полную трассировку стека?

3. Я не уверен, потому что он прерывается при закрытии фигурной скобкой, он никогда не останавливается на строке кода. Но если это полезно, пустой экран, на котором появляется сообщение об ошибке, говорит You app has entered a break state, but there is no code to show because all threads were executing external code (typically system or framework code).

4. Вы сделали EmployeeListViewModel.GetEmployees async void , по-видимому, чтобы иметь возможность вызывать его без await конструктора. Это не сработает, и я не удивлен, что он выходит из строя. Смотрите «Что НЕ следует делать» в blog.stephencleary.com/2013/01/async-oop-2-constructors.html .

5. @GSerg Асинхронные пустоты не так уж редки для MVVM, где у вас есть события void. Но я согласен с тем, что это очень вероятно, когда происходит сбой, и из-за того, что вызов не ожидает, нет надлежащего сообщения об ошибках.