c# - 即使定义了显式转换运算符,也会出现 InvalidCastException

标签 c#

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

我有一个像这样定义的转换运算符:

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”类型。 .

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

最佳答案

我从 BaseServices.OAuthClient 创建了另一个特定的显式转换至ViewModels.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);
}

这有效。

关于c# - 即使定义了显式转换运算符,也会出现 InvalidCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033931/

相关文章:

c# - ASP.NET MVC3 角色

c# - 如果派生类没有覆盖方法,应该调用哪个版本?

c# - 如何强制 DropDownList 样式的 ComboBox 仅在用户单击下拉按钮时打开?

c# - 打开CV : set model position using rotation and translation vector

c# - ListView 内的内联脚本条件语句

c# - 格式化字符串的输出

c# - 如何使用 SkiaSharp.Views.UWP?

c# - 通过纹理偏移滚动 2D/3D 背景

c# - 根据枚举值创建字典

c# - 使用第一对作为种子聚合