我正在尝试编写一个可以处理许多不同类型的输入的类,所有这些都实现相同的接口。
我有以下代码:
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
我的可枚举的每一次迭代。即使我不能完全避免动态调用,有没有办法优化这个方法,使动态调用不再驻留在我的循环中?