与接口列表的接口

ano*_*ous 3 c# generics interface

也许我很笨,但......

我有:

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

    // stuff
}

public interface IRequestDetail
{
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

然后我有:

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

    // stuff
}

public class MyRequestDetail : IRequestDetail
{
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

它不起作用.

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

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

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

Mic*_*ows 12

我认为,基于问题是您希望将详细信息视为通用列表并强制实施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
}
Run Code Online (Sandbox Code Playgroud)

这应该适合你.

编辑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);
    }
}
Run Code Online (Sandbox Code Playgroud)