You have to rotate it around the IsAssignableFrom MSDN . Since IsAssignableFrom works differently, as expected: BaseType.IsAssignableFrom(DerviedType) returns true.
var ruleTypes = from t in ruleType.Assembly.GetTypes() where ruleType.IsAssignableFrom(t) select t;
If you do not want to return IRule :
var ruleTypes = from t in ruleType.Assembly.GetTypes() where ruleType.IsAssignableFrom(t) && t != ruleType select t;
source share