the1mason
the1mason
CC#
Created by the1mason on 4/20/2025 in #help
typeof(T).IsAssignableFrom does not work as I expected
There is a method in a generic class PluginLoader<TPlugin> : IPluginLoader<TPlugin>:
private static TPlugin? CreatePlugin(Assembly assembly)
{
var types = assembly.GetTypes().Where(t => typeof(TPlugin).IsAssignableFrom(t)).ToArray();
return types.Length switch
{
> 1 => throw new ApplicationException(
$"Found more than 1 type, implementing IPlugin in assembly {assembly.FullName}"),
< 1 => throw new ApplicationException(
$"Found 0 types, implementing IPlugin in assembly {assembly.FullName}"),
_ => (TPlugin?)Activator.CreateInstance(types.First()) ?? default
};
}
private static TPlugin? CreatePlugin(Assembly assembly)
{
var types = assembly.GetTypes().Where(t => typeof(TPlugin).IsAssignableFrom(t)).ToArray();
return types.Length switch
{
> 1 => throw new ApplicationException(
$"Found more than 1 type, implementing IPlugin in assembly {assembly.FullName}"),
< 1 => throw new ApplicationException(
$"Found 0 types, implementing IPlugin in assembly {assembly.FullName}"),
_ => (TPlugin?)Activator.CreateInstance(types.First()) ?? default
};
}
There is also an interface IWebPlugin with implementation Plugin1 This method is called with an assembly, containing Plugin1 and tries to create an instance of it. It worked before I made PluginLoader generic, but now typeof(TPlugin).IsAssignableFrom(t) returns false. Plugin1.GetInterface("IWebPlugin") returnsIWebPlugin, typeof(TPlugin gets IWebPlugin too, but the original condition fails nevertheless. Here's my result of playing with the debugger
var debugTypes = assembly.GetTypes()
{System.RuntimeType[1]}
[0]: {Plugin1.Plugin1}

var iWebPlugin = debugTypes[0].GetInterface("IWebPlugin")
{RainCrab.Plugins.AspNet.IWebPlugin}


var iaf = iWebPlugin.IsAssignableFrom(debugTypes[0])
true

var iafGeneric = typeof(TPlugin).IsAssignableFrom(debugTypes[0])
false

typeof(TPlugin)
{RainCrab.Plugins.AspNet.IWebPlugin}
var debugTypes = assembly.GetTypes()
{System.RuntimeType[1]}
[0]: {Plugin1.Plugin1}

var iWebPlugin = debugTypes[0].GetInterface("IWebPlugin")
{RainCrab.Plugins.AspNet.IWebPlugin}


var iaf = iWebPlugin.IsAssignableFrom(debugTypes[0])
true

var iafGeneric = typeof(TPlugin).IsAssignableFrom(debugTypes[0])
false

typeof(TPlugin)
{RainCrab.Plugins.AspNet.IWebPlugin}
Why if Plugin1 implements IWebPlugin and typeof(TPlugin) is IWebPlugin, Plugin1 is not assignable from IWebPlugin?
11 replies