Я пытаюсь показать кому-то использование интерфейсов в безумной ситуации, которую они создали. У них есть несколько несвязанных объектов в списках, и им нужно выполнить операцию с двумя строковыми свойствами в каждом объекте. Я отмечаю, что если они определяют свойства как часть интерфейса, они могут использовать объект интерфейса в качестве типа для параметра метода, который воздействует на него; например:
void PrintProperties(IEnumerable<ISpecialProperties> list)
{
foreach (var item in list)
{
Console.WriteLine("{0} {1}", item.Prop1, item.Prop2);
}
}
Кажется, что это все хорошо, но списки, над которыми нужно работать, не должны (и не должны) объявляться с интерфейсом в качестве параметра типа. Однако не похоже, что вы можете привести к другому параметру типа. Например, это терпит неудачу, и я не могу понять, почему:
using System;
using System.Collections.Generic;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
List<Test> myList = new List<Test>();
for (int i = 0; i < 5; i++)
{
myList.Add(new Test());
}
PrintList((IEnumerable<IDoSomething>)myList);
}
static void PrintList(IEnumerable<IDoSomething> list)
{
foreach (IDoSomething item in list)
{
item.DoSomething();
}
}
}
interface IDoSomething
{
void DoSomething();
}
public class Test : IDoSomething
{
public void DoSomething()
{
Console.WriteLine("Test did it!");
}
}
}
Я могу использовать для этого член Enumerable.Cast<T>
, но я искал метод, который мог бы работать и в .NET 2.0. Кажется, это должно быть возможно; что мне не хватает?