Как передать метод расширения в качестве аргумента конструктору класса, а методы в этом классе используют это расширение как расширение?Пропустить расширение метода в качестве аргумента
Например: это файл, который содержит IEnumerable метод расширения:
namespace System.Collections.Generic
{
public static partial class IEnumerableMethodExtensions
{
/// <summary>
/// Used by IsImageFile to determine if a file is a graphic type
/// we care about. (Not an Extension Method, just a helper method)
/// </summary>
public static string[] GraphicFileExtensions = new string[] { ".png", ".bmp", ".gif", ".jpg", ".jpeg" };
/// <summary>
/// Method Extension - specifies that FileInfo IEnumerable should only
/// return files whose extension matches one in GraphicFileExtensions[].
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
public static IEnumerable<FileInfo> IsImageFile(this IEnumerable<FileInfo> files)
{
foreach (FileInfo file in files)
{
string ext = file.Extension.ToLower();
if (GraphicFileExtensions.Contains(ext))
yield return file;
}
}
}
}
Я хочу, чтобы иметь возможность пройти IsImageFile() в качестве аргумента конструктора для этого объекта, так что методы в этом классе могут использовать IsImageFile в качестве расширения метода:
public class MainFileInfoSource
{
public MainFileInfoSource(List<DirectoryInfo> Directories,
ENUMERABLE_METHOD_EXTENSION_FILE_FILTER TheMethodExtension)
{
_myFilterMethodExtension = TheMethodExtension;
_directories = Directories;
initializeFileInfoList();
}
...
/// <summary>
/// Initializes the Files list.
/// </summary>
private void initializeFileInfoList()
{
...
for (int i = 0; i < _directories.Count; i++)
{
iEnumerableFileInfo = new[] { _directories[i] }.Traverse(dir =>
getDirectoryInfosWithoutThrowing(dir)).SelectMany(dir =>
getFileInfosWithoutThrowing(dir)._myFilterMethodExtension());
http://stackoverflow.com/questions/1016033/extension-methods-defined-on-value-types-cannot-be-used-to-create-delegates-wh – AlexanderBrevig
@AlexanderBrevig вы можете мне помочь понять, какая часть этого вопроса/ответа - мой прием? Видимо, я недостаточно умен, чтобы видеть связь. –
Вы не можете этого сделать, потому что вызовы статических методов компилируются во время компиляции. Объяснение того, какова ваша фактическая цель, может помочь найти подходящий подход (например, метод расширения, реализованный с использованием шаблона локатора службы для поиска реализации). –