【问题标题】:Cannot convert from interface to class无法从接口转换为类
【发布时间】:2017-03-07 15:53:26
【问题描述】:

当我尝试将我的界面添加到数据库时,我的方法出现错误,它给了我错误,

参数 1:无法从“ForumSite.ActionsAndMethods.Registration.IRegistration”转换为“ForumSite.Models.User”。

这是IRegistration中的代码:

 using ForumSite.Models;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

namespace ForumSite.ActionsAndMethods.Registration
{
public interface IRegistration
{
    int UserId { get; }
    string Email { get; }
    string Password { get; }
    string FirstName { get; }
    string LastName { get; }
    DateTime Birthday { get; }
    DateTime DateCreated { get; set; }
    string MobileNumber { get; }
    string Address { get; }
    int UserIsDeleted { get; set; }
    int UserRoleId { get; set; }
    UserRole UserRole { get; }
}
}

这是我模型中的代码:

namespace ForumSite.Models
{
using ActionsAndMethods.Registration;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

public partial class User : IRegistration
{
    public int UserId { get; set; }
    [Display(Name = "Email Address")]
    [Required(ErrorMessage = "This field required.")]
    [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@([a-zA-Z]+)\.([a-zA-Z]{2,5})$", ErrorMessage = "Enter Valid Email Address")]
    [StringLength(50, MinimumLength = 8, ErrorMessage = "8 to 50 characters only")]
    public string Email { get; set; }

    [Display(Name = "Password")]
    [Required(ErrorMessage = "This field required.")]
    [RegularExpression(@"^[a-zA-Z0-9]+$", ErrorMessage = "Alphanumeric characters only")]
    [StringLength(50, MinimumLength = 8, ErrorMessage = "8 to 50 characters only")]
    public string Password { get; set; }

    [Display(Name = "Confirm Password")]
    [Required(ErrorMessage = "This field required.")]
    [RegularExpression(@"^[a-zA-Z0-9]+$", ErrorMessage = "Alphanumeric characters only")]
    [StringLength(50, MinimumLength = 8, ErrorMessage = "8 to 50 characters only")]
    public string PasswordConfirm { get; set; }

    [Display(Name = "First Name")]
    [Required(ErrorMessage = "This field required.")]
    [RegularExpression(@"^[a-zA-Z\s]+$", ErrorMessage = "Letters Only.")]
    public string FirstName { get; set; }

    [Display(Name = "Last Name")]
    [Required(ErrorMessage = "This field required.")]
    [RegularExpression(@"^[a-zA-Z\s]+$", ErrorMessage = "Letters Only.")]
    public string LastName { get; set; }

    [Display(Name = "Birthday")]
    [Required(ErrorMessage = "This field required.")]
    public DateTime Birthday { get; set; }
    public DateTime DateCreated { get; set; }

    [Display(Name = "Mobile Number")]
    [Required(ErrorMessage = "This field required.")]
    [RegularExpression(@"^[0-9]+$", ErrorMessage = "Numeric input only.")]
    public string MobileNumber { get; set; }

    [Display(Name = "Address")]
    [Required(ErrorMessage = "This field required.")]
    public string Address { get; set; }
    public int UserIsDeleted { get; set; }
    public int UserRoleId { get; set; }

    public UserRole UserRole { get; set; }
}
}

最后,我将用户添加到我的数据库的方法:

using ForumSite.ActionsAndMethods.Registration;
using ForumSite.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ForumSite.ActionsAndMethods
{
public class RegisterAction : IRegistration
{
    ForumDBEntities ent = new ForumDBEntities();
    public void Registration(IRegistration reg)
    {
        reg.DateCreated = DateTime.Now;
        reg.UserRoleId = 1;
        reg.UserIsDeleted = 0;

        ent.Users.Add(reg);
        ent.SaveChanges();
    }

    string IRegistration.Address { get; }
    int IRegistration.UserId { get; }
    string IRegistration.Email { get; }
    string IRegistration.Password { get; }
    string IRegistration.FirstName { get; }
    string IRegistration.LastName { get; }
    DateTime IRegistration.Birthday { get; }
    DateTime IRegistration.DateCreated { get; set; }
    string IRegistration.MobileNumber { get; }
    int IRegistration.UserIsDeleted { get; set; }
    int IRegistration.UserRoleId { get; set; }

    UserRole IRegistration.UserRole { get; }
}

}

我想知道是什么导致了这个错误?

【问题讨论】:

  • 虽然每个User 都实现IRegistration,但并不是每个IRegistration 实例都是User
  • 您也需要显示实际引发错误的行
  • 你能告诉我们错误发生的代码吗?
  • User 必然是 IRegistrationIRegistraiton 不一定是 User。这就是IRegistration 存在的原因:不同的、不相关的类可以实现它。如果你有另一个类CoffeeTable,它实现了IRegistration,那么每个CoffeeTable必然都是User吗?显然不是。因此编译器不会让你做出这样的疯狂假设。你是说“滑板和飞机都是交通工具;因此,编译器应该假设每个滑板都有四个巨型喷气发动机”。
  • @DavidG 你应该有这个答案兄弟。

标签: c# class interface


【解决方案1】:

虽然每个User 都实现IRegistration,但并不是每个IRegistration 实例都是User

例如,您的RegisterAction 实现了IRegistration。所以如果你想做的事情是可能的,理论上你可以有这个代码:

RegisterAction action = GetRegisterAction();

RegisterAction action2 = new RegisterAction(action);

这意味着当你来做:

ent.Users.Add(reg);

它将失败,因为reg 不是User

你可以这样解决它:

var user = reg as User;
if(user != null)
{
    ent.Users.Add(user);
}

但实际上你应该先看看你的结构,因为这样做似乎很奇怪。

【讨论】:

  • 谢谢先生。代码终于奏效了。但我仍然有一个关于数据库的错误,说“一个或多个实体的验证失败。有关更多详细信息,请参阅 'EntityValidationErrors' 属性。” :D
【解决方案2】:

你还没有告诉你得到编译错误的确切位置,但我的猜测是它在 Registration 方法中的 ent.Users.Add(reg) 行中。

要修复编译错误,您应该将Registration 方法的参数从IRegistration 更改为User

public void Registration(User reg)
{
    reg.DateCreated = DateTime.Now;
    reg.UserRoleId = 1;
    reg.UserIsDeleted = 0;

    ent.Users.Add(reg);
    ent.SaveChanges();
}

但是,如果您尝试将 IRegistration 而不是 User 传递给 Registration 方法,这可能会在调用链的上游触发另一个编译错误。

虽然User 可以(并且确实)实现了IRegistration,但您不能假设任何实现IRegistration 的东西都是User。如果您的代码基于该假设,您将不得不修复它以解决您的问题。

【讨论】:

  • 我也试过这段代码,它工作正常。感谢您的帮助! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2016-10-20
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多