将未实现接口但符合所有条件的对象添加到期望接口的列表中

Sea*_*son 3 c# interface anonymous-types

我有以下内容:

List<IReport> myList = new List<IReport>();

Report myReport = TheirApi.GetReport();
Run Code Online (Sandbox Code Playgroud)

myReport符合IReport的所有资格,但无法实现IReport,因为我无法访问ItsApi的源代码.转换为IReport类型显然会导致null,我读到我无法将匿名类型转换为接口.

我有什么选择吗?

包装类正是医生所要求的:

ReportServices.GetAllCustomReports().ToList().ForEach(customReport => _customReports.Add(new ReportWrapper(customReport)));

public class ReportWrapper : IReport
{
    private Report inner;

    public int ID 
    {
        get { return inner.ID;  }
        set { inner.ID = value; }
    }
    public string Name
    {
        get { return inner.Name; }
        set { inner.Name = value; }
    }

    public ReportWrapper(Report obj)
    {
        inner = obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mig*_*elo 5

您需要将此对象包装在另一个实现该接口的对象中,然后您需要实现它来调用内部对象的属性和方法.

例如:

public class ReportWrapper : IReport
{
    MyObjectIsLikeReport inner;

    public ReportWrapper(MyObjectIsLikeReport obj) {
        this.inner = obj;
    }

    public void ReportMethod(int value) {
        this.inner.ReportMethod(value);
    }

    public int SomeProperty {
        get { return this.inner.SomeProperty; }
        set { this.inner.SomeProperty = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它,您可以这样做:

List<IReport> myList = new List<IReport>();
MyObjectIsLikeReport myReport = TheirApi.GetReport();
myList.Add(new ReportWrapper(myReport));
Run Code Online (Sandbox Code Playgroud)