考虑以下代码:
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。
答案 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;
}