InvalidCastException,尽管定义了显式强制转换操作符

本文关键字:转换 操作符 定义 InvalidCastException | 更新日期: 2023-09-27 18:06:31

这很奇怪。我的显式强制转换操作符不起作用。

我有一个强制转换操作符定义如下:

public class OAuthClient
{
  public string LoginUrl { get; set; }
  public string ImagePath { get; set; }
  public string ImageTitle { get; set; }
  public string ImageAlt { get; set; }
  public static OAuthClient FromFrameworkOAuthClient(
              BaseServices.OAuth.IOAuthClient client)
  {
    return new OAuthClient
    {
      LoginUrl = client.LoginUrl,
      ImagePath = client.ImagePath,
      ImageTitle = client.ImageTitle,
      ImageAlt = client.ImageAlt
    };
   }
   public static OAuthClient FromGoogleClient(GoogleClient client)
   {
     return FromFrameworkOAuthClient(client);
   }
   public static OAuthClient FromFacebookClient(FacebookClient client)
   {
     return FromFrameworkOAuthClient(client);
   }
   public static explicit operator OAuthClient(BaseServices.OAuth.FacebookClient client)
   {
     return FromFrameworkOAuthClient(client);
   }
   public static explicit operator OAuthClient(BaseServices.OAuth.GoogleClient client)
   {
     return FromFrameworkOAuthClient(client);
   }
  }
}

Controller方法中,我这样做:

protected virtual IEnumerable<ViewModels.OAuthClient> GetViewModelOAuthClients(
                   IEnumerable<IOAuthClient> oAuthClients)
{
  oAuthClients.ForEach(client => { client.GetLoginUrl(); });
  return oAuthClients.Select(c => (ViewModels.OAuthClient)c);
}

奇怪的是,我得到一个InvalidCastException说,无法转换类型为'BaseServices.OAuth的对象。FacebookClient'输入'Web.Presentation.ViewModels.OAuthClient'..

我不知道发生了什么事。这很奇怪。我肯定错过了一些非常微小的东西。帮助感激。

InvalidCastException,尽管定义了显式强制转换操作符

我创建了另一个特定的显式转换,从BaseServices.OAuthClientViewModels.OAuthClient,如下所示:

public static explicit operator OAuthClient(BaseServices.OAuth.OAuthClient client)
{
  return FromFrameworkOAuthClient(client);
}

然后将IEnumerable<IOAuthClient>中的每个项目先转换为BaseServices.OAuthClient,然后再转换为ViewModels.OAuthClient

protected virtual IEnumerable<ViewModels.OAuthClient> GetViewModelOAuthClients(
                 IEnumerable<IOAuthClient> oAuthClients)
{
  oAuthClients.ForEach(client => { client.GetLoginUrl(); });
  return oAuthClients.Select(c => (ViewModels.OAuthClient)(OAuthClient)c);
}