c#如何强制转换为IList <SomeInterface>并返回IList <MyOBject>

时间:2019-07-14 17:54:59

标签: c# linq interface casting

考虑以下代码:

public interface ITest
{
    public string Id { get; set; }
}

public class MyObject : ITest {
{
    public string Id { get; set; }
    public string Value { get; set; }
}

public void Run()
{
    IList<MyOBject> myObjects = GetMyObjects();

    myObjects = GetTestITems(myObjects);
}

public IList<ITest> GetTestItems(IList<ITest> items)
{
    //run some logic
    return items;
}

以上代码将失败两次。第一次是尝试将IList<MyObject>强制转换为IList<ITest>,然后是尝试将其强制转换回IList<MyObject>。但是,如果我将代码更改为以下代码,那么它将起作用:

public void Run()
{
    IList<MyOBject> myObjects = GetMyObjects();
    var myTests = new List<ITest>();

    foreach(var o in myObjects) {
        myTests.Add(o);
    }

    var result = GetTestITems(myTests);
    myObjects = new List<MyObject>();

    foreach(var r in result) {
        myObjects.Add(r);
    }
}

有没有一种方法可以做到这一点而不必像这样循环两次?可能是linq方式还是某种形式的转换?我尝试了直接强制转换,但是在两个实例上都失败了,分别转到ITest和MyObject。

1 个答案:

答案 0 :(得分:1)

在这种情况下,我认为您需要使用泛型:

public interface ITest
{
    public string Id { get; set; }
}

public class MyObject : ITest {
{
    public string Id { get; set; }
    public string Value { get; set; }
}

public void Run()
{
    List<MyOBject> myObjects = new List<MyOBject>(); // With your objects

    myObjects = GetTestItems<MyOBject>(myObjects);
}

public IList<T> GetTestItems<T>(IList<T> items)
where T : ITest
{
    //run some logic with props of ITest
    return items;
}