多くの異なるタイプの入力を処理できるクラスを作成しようとしていますが、それらはすべて同じインターフェースを実装しています。
次のコードがあります。
private IEnumerable<IPlan> DevisePlans(ITile tile, IEnumerable<ISpace> spaces)
{
MethodInfo method = GetType().GetMethod("DevisePlans",
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new[] {tile.GetType(), typeof(ISpace)},
null);
var type = typeof(Func<,,>).MakeGenericType(tile.GetType(), typeof(ISpace), typeof(IEnumerable<IPlan>));
var planner = Delegate.CreateDelegate(type, this, method);
return spaces.SelectMany(s => (IEnumerable<IPlan>)planner.DynamicInvoke(tile, s));
}
DevisePlans
クラス内には のさまざまな実装が多数あり、それぞれに を実装する最初のパラメータ タイプがありますITile
。
private IEnumerable<IPlan> DevisePlans(Foo tile, ISpace space) { /* ... */ }
private IEnumerable<IPlan> DevisePlans(Bar tile, ISpace space) { /* ... */ }
DynamicInvoke
これは機能しますが、列挙可能なすべての反復を呼び出しています。動的呼び出しを完全に回避できない場合でも、動的呼び出しがループ内に存在しないようにこのメソッドを最適化する方法はありますか?