私は、彼らが作成したクレイジーな状況でのインターフェースの使用法を誰かに見せようとしています. リストには関連のないオブジェクトがいくつかあり、各オブジェクトの 2 つの文字列プロパティに対して操作を実行する必要があります。プロパティをインターフェイスの一部として定義すると、インターフェイス オブジェクトを、それに作用するメソッド パラメーターの型として使用できることを指摘しておきます。例えば:
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 でも機能するメソッドを探していました。これは可能であるように思われます。私は何が欠けていますか?