加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 与接口列表的接口

发布时间:2020-12-15 19:30:29 所属栏目:百科 来源:网络整理
导读:也许我很笨,但…… 我有: public interface IRequest{ IListIRequestDetail Details { get; set; } // stuff}public interface IRequestDetail{ // stuff} 然后我有: public class MyRequest : IRequest{ IListMyRequestDetail Details {get; set; } // st
也许我很笨,但……

我有:

public interface IRequest
{
    IList<IRequestDetail> Details { get; set; }

    // stuff
}

public interface IRequestDetail
{
    // stuff
}

然后我有:

public class MyRequest : IRequest
{
    IList<MyRequestDetail> Details {get; set; }

    // stuff
}

public class MyRequestDetail : IRequestDetail
{
    // stuff
}

它不起作用.

C#对我很生气,因为MyRequest由于没有IRequestDetail的IList而没有实现接口.

现在,如果我更改它以便细节是IRequestDetail的IList,那么我必须将它转换为MyRequestDetail代码中的任何地方我使用非接口成员(我有几个请求共享常见的东西,但然后专门化).

我有点理解为什么它错了,但并不完全!

解决方法

我认为,基于问题是您希望将详细信息视为通用列表并强制实施IRequestDetail的问题.您还希望为实现类更具体地键入它.在这种情况下,您需要使IRequest通用.

试试这个:

public interface IRequest<T> where T : IRequestDetail
{
    IList<T> Details { get; set; }

    // stuff
}

public class MyRequest : IRequest<MyRequestDetail>
{
    public IList<MyRequestDetail> Details {get; set; }

    // stuff
}

这应该适合你.

编辑2017-03-17

在回复@ Robert的评论时,请参阅下面的扩展代码:

public interface IRequestDetail
{

}

public class MyRequestDetail : IRequestDetail
{

}

public interface IRequest<T> where T : IRequestDetail
{
    IList<T> Details { get; set; }

    // stuff
}

public class MyRequest<T> : IRequest<T>
    where T : IRequestDetail
{
    public IList<T> Details { get; set; }

    // stuff
}

public class Consumer
{
    public void MyFunction<T>(IRequest<T> request)
        where T : IRequestDetail
    {

    }

    public void Foo()
    {
        var test = new MyRequest<MyRequestDetail>();
        MyFunction(test);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读