C# 反射窗体使用通用接口创建实例

C# 反射窗体使用通用接口创建实例,c#,generics,C#,Generics,我的界面有一个通用选择,如下所示: public interface IMyInterface{ void ok(); } var maps = (from t in types from i in t.GetInterfaces() where typeof(IMyInterface).IsAssignableFrom(t) &&

我的界面有一个通用选择,如下所示:

        public interface IMyInterface{
              void ok();
        }

        var maps = (from t in types
                    from i in t.GetInterfaces()
                    where typeof(IMyInterface).IsAssignableFrom(t) &&
                          !t.IsAbstract &&
                          !t.IsInterface
                    select (IMyInterface)Activator.CreateInstance(t)).ToArray();
但是我把界面改成了通用的

        public interface IMyInterface<T>{
              void ok<T>();
        }

        var maps = (from t in types 
                    from i in t.GetInterfaces()
                    where i.IsGenericType 
                        && i.GetGenericTypeDefinition() == typeof(IMyInterface<>)
                        && !t.IsAbstract
                        && !t.IsInterface
                        select ???????????????????????????????
                    ).ToArray();
但现在铸件不起作用了

        select (IMyInterface<>)Activator.CreateInstance(t)).ToArray();
为强制转换提供生成错误。

IMyInterface不是IMyInterface,因此强制转换无效。编译器只是防止您在运行时找到它,因为您永远不能在C中拥有类型GenericType的值-非具体化的泛型类型仅用于反射

注意typeofIMyInterface.IsAssignableFromtypeofIMyInterface如何返回false。这两种类型完全不同,只共享一个通用的泛型定义,与List和List相同,它们是两种不同的类型,只共享一个通用的泛型定义。C泛型不是Java泛型


没有通用类型可用于包含列表和列表,就像没有通用类型可用于IMyInterface和IMyInterface一样。要么确保所有内容都正确通用,要么创建另一个非通用且IMyInterface实现的接口。

@bookmarker不会真正改变任何内容。您仍在尝试强制转换为非真实类型。您的方法声明是错误的,可惜您忽略了它。它必须是T类型的泛型,。然后使用IMyInterface而不是IMyInterface。IMyInterface和T都需要在两个项目都引用的程序集中声明。这不太可能是一个正确的方法。