繁体   English   中英

在C#中,将实现接口X的对象传递给从接口X继承的接口Y时出错。

[英]Error when passing an object that implements interface X to an interface Y that inherits from interface X. in C#

当前,当将实现接口X的对象传递给从接口XI继承的接口Y时,会收到以下错误消息:

无法将类型'InterfaceTestApp.Repositories.IUserModel'隐式转换为'InterfaceTestApp.Lib.IUserModel'。 存在显式转换(您是否缺少演员表?)

这是我的测试设置:

资料库

namespace InterfaceTestApp.Repositories
{
    public class UserTestRepo
    {
        public IUserModel GetUser() => new UserModel() { Id = 1, Name = "Test" };
    }
}

namespace InterfaceTestApp.Repositories
{
    public interface IUserModel
    {
        int Id { get; set; }
        string Name { get; set; }
    }

    public class UserModel : IUserModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

图书馆

namespace InterfaceTestApp.Lib
{
    interface IUserModelLib : Repositories.IUserModel { }
}

namespace InterfaceTestApp.Lib
{
    class Authentication
    {
        public IUserModelLib AuthenticateUser() => new Repositories.UserTestRepo().GetUser();
    }
}

基本上,我在这里要做的是避免将Repo项目的任何部分暴露给使用Lib项目的任何应用程序。 如您所见,IUserModelLib只是一个传递接口。 它从回购项目中的IUserModel继承了所有内容。

应该有一种方法可以执行此操作,而不必进行某种手工转换。 任何帮助,将不胜感激。 谢谢!

您在这里混淆了继承的顺序/方向。

  • Lib.IUserModelLib实现Repositories.IUserModel
  • UserModel实现Repositories.IUserModel

仅仅因为它们共享一个公共接口并不意味着可以将UserModel分配给Lib.IUserModelLib

  • Repositories.UserTestRepo().GetUser()返回一个Repositories.IUserModel
  • 因此AuthenticateUser()需要返回Repositories.IUserModel而不是Lib.IUserModelLib

基本上,我在这里要做的是避免将Repo项目的任何部分暴露给使用Lib项目的任何应用程序。 如您所见,IUserModelLib只是一个传递接口。 它从回购项目中的IUserModel继承了所有内容。

在那种情况下,您需要包装UserModel类而不是IUserModel接口,将类设置为internal而不是public并定义您的friend-assembly 这样,您可以在Lib项目中使用UserModel ,而无需将其暴露给使用Lib的任何项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM