Я бы на самом деле предложил следующее:
public static IEnumerable<CaptureType> ListPluginsWith<CaptureType>()
where CaptureType : class
{
foreach (var plugin in Bot.AutoPlugins)
{
CaptureType plug = plugin.Interface as CaptureType;
if (plug != null)
yield return plug;
}
}
Это имеет ряд преимуществ:
- Если вы используете ключевое слово
is
, вы в итоге делаете дваприведение типов (оценка x is y
в основном приведение типов и имеет те же характеристики производительности), поэтому, если вы делаете (if (x is Y) { blah = (Y)x }
, вы делаете два приведения вместо одного, для которого as
и проверка null
требуют. - При использовании интегратора (то есть
yield return
) вам не нужно создавать временный List<CaptureType>
в памяти, преобразовывать его в массив и затем возвращать массив.
Также обратите внимание на where CaptureType : class
. Поскольку CaptureType
является интерфейсом, вы можете быть уверены, что он всегда будет проходить, но это ограничение необходимо для использования ключевого слова as
. Если у вас есть "базовый интерфейс, который реализуют все ваши плагины (например, IPlugin
возможно), тогда вы можете заменить where CaptureType : class
на where CaptureType : IPlugin
вместо этого.