c# - 我可以避免或优化这种动态调用吗?

标签 c# generics optimization dynamic

我正在尝试编写一个可以处理许多不同类型输入的类,所有这些输入都实现相同的接口(interface)。

我有以下代码:

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。即使我无法完全避免动态调用,是否有任何方法可以优化此方法,以便动态调用不再驻留在我的循环中?

最佳答案

看起来就像您正在使用它来调用tile<的DevisePlans最具体的重载(而不是覆盖)/ 提供。假设我的理解是正确的(如果我错了,请告诉我),那么只需使用 dynamic - 它有一个内置缓存并为此进行了优化:

return spaces.SelectMany(s =>
    (IEnumerable<IPlan>)DevisePlans((dynamic)tile, (dynamic)s)
);

还有...就是这样!

但是,我很想寻找涉及多态性(针对 ITile)或 C# 4.0 方差的答案。

关于c# - 我可以避免或优化这种动态调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10323105/

相关文章:

c# - C# 中 typeof(int) 和 typeof(Int32) 之间的区别可能吗?

java - 仅根据步行时间绘制 map

在两个集合之间映射元素的算法

c# - Xamarin Firebase 发送电子邮件验证

c# - 使用通用约束时如何使用继承

.net - 什么时候确定泛型类型?可以影响吗?

optimization - 乘法和加法函数

c# - 仅在唯一时返回随机数

c# - 在部分 View 中存储 session

C# Xml 值总是为空