Это может быть просто краткое изложение уже опубликованных ответов, но я не думаю, что есть способ сделать это без предварительного построения карты Guid-> Type.
Мы делаем это в наших рамках при инициализации:
static TypeManager()
{
AppDomain.CurrentDomain.AssemblyLoad += (s, e) =>
{
_ScanAssembly(e.LoadedAssembly);
};
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
_ScanAssembly(a);
}
}
private static void _ScanAssembly(Assembly a)
{
foreach (Type t in a.GetTypes())
{
//optional check to filter types (by interface or attribute, etc.)
//Add type to type map
}
}
Обработка события AssemblyLoad заботится о динамически загружаемых сборках.
Насколько я понимаю, Type.GUID использует версию сборки типа как часть алгоритма генерации Guid. Это может привести к проблемам при увеличении номеров версий сборки. Возможно, было бы целесообразно использовать метод GetDeterministicGuid, описанный в другом ответе, в зависимости от вашего приложения.