Я столкнулся с той же проблемой, когда IsAssignableFrom всегда возвращал false, но провел некоторые эксперименты и нашел обходной путь. Ключ должен убедиться, что оба типа в сравнении находятся в контексте ReflectionlyOnly.
Другими словами, это вообще не работает:
var types = Assembly.ReflectionOnlyLoad(assemblyName).GetExportedTypes();
foreach( var t in types )
{
bool check = SomeBaseType.IsAssignableFrom(t);
}
Это, кажется, всегда дает check=false
, но я думаю, это потому, что t
находится в контексте только для отражения, а SomeBaseType
- нет.
Обходной путь, который я нашел, состоял в том, чтобы загрузить сборку базового класса в контексте только для отражения, а затем найти эквивалентный базовый тип в этом контексте. Затем мы можем сделать сравнение, где оба типа предназначены только для отражения:
var baseAssembly = Assembly.ReflectionOnlyLoad(typeof(SomeBaseType).Assembly.FullName);
var baseTypes = baseAssembly.GetExportedTypes();
var reflectionOnlyBaseType = Array.Find(baseTypes,(t)=>(t.FullName==typeof(SomeBaseType).FullName));
var types = Assembly.ReflectionOnlyLoad(assemblyName).GetExportedTypes();
foreach( var t in types )
{
bool check = reflectionOnlyBaseType.IsAssignableFrom(t);
}
Кажется, это дает ожидаемый результат. Возможно, есть более эффективный способ добраться до этого контекста только для отражения без перезагрузки сборки (я не эксперт по C #), но это был самый простой способ, который я смог найти.
Похоже, что один и тот же подход работает как для IsSubclassOf, так и для IsAssignableFrom.