dlr*_*as2 2 c# generics optimization dynamic
我正在尝试编写一个可以处理许多不同类型输入的类,所有这些类都实现了相同的接口.
我有以下代码:
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));
}
Run Code Online (Sandbox Code Playgroud)
类中有许多不同的实现DevisePlans,每个实现都有一个实现的第一个参数类型ITile.
private IEnumerable<IPlan> DevisePlans(Foo tile, ISpace space) { /* ... */ }
private IEnumerable<IPlan> DevisePlans(Bar tile, ISpace space) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
这有效,但我要求DynamicInvoke我的可枚举的每一次迭代.即使我无法完全避免动态调用,有没有办法优化此方法,以便动态调用不再驻留在我的循环中?
它看起来像你正在使用这个调用最具体的过载(未覆盖)的DevisePlans用于tile提供.假设我的理解是正确的(请告诉我,如果我错了),那么只需使用dynamic- 它有一个内置缓存并针对此进行了优化:
return spaces.SelectMany(s =>
(IEnumerable<IPlan>)DevisePlans((dynamic)tile, (dynamic)s)
);
Run Code Online (Sandbox Code Playgroud)
而且...... 就是这样!
但是,我会想要寻找一个涉及多态(反对ITile)或C#4.0方差的答案.