Ну, я думаю, , что вы запрашиваете, - это способ определения параметров типа универсального типа во время выполнения - в вашем примере ситуация сложна, потому что вы после интерфейса, а не экземпляр объекта.
Тем не менее, это все еще довольно просто, следующий пример должен по крайней мере указать вам правильное направление, как это сделать:
object obj= new List<string>();
Type type = obj.GetType();
Type enumerable = type.GetInterfaces().FirstOrDefault(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>));
if (enumerable != null)
{
Type listType = enumerable.GetGenericArguments()[0];
if (listType == typeof(string))
{
IEnumerable<string> e = obj as IEnumerable<string>;
}
}
Но я не могу понять, как это поможет вам решить основную проблему мониторинга кеша?
В прошлом, когда я пытался отслеживать производительность кэшей, я обнаружил, что создание собственных простых счетчиков Perfmon очень полезно для целей мониторинга - в качестве базового примера начните со счетчика "# Entries" (который вы увеличиваете всякий раз, когда элемент добавляются в кэш и уменьшаются всякий раз, когда элемент удаляется из кеша), и добавляются счетчики, которые, по вашему мнению, будут полезны на ходу - счетчик попаданий в кэш и счетчик пропусков в кэш-памяти также обычно довольно полезны.
Ваш счетчик Perfmon может также разбивать информацию о кэшировании, имея множество экземпляров ваших счетчиков, по одному для каждого кэшируемого типа (или, в вашем случае, более вероятно, что кэшируется общий тип IEnumerable
) - так же, как и «Процесс». «У группы счетчиков perfmon есть экземпляр для каждого процесса в вашей системе, у вас будет экземпляр для каждого типа в кэше (плюс вы также должны добавить экземпляр« _Total »или аналогичный).
Использование счетчиков Perfmon при записи операций в кеш позволяет вам контролировать производительность вашего кеша с достаточной детализацией при очень небольшом снижении производительности во время выполнения.