反射表单使用通用接口创建实例

本文关键字:创建 实例 接口 反射 表单 | 更新日期: 2023-09-27 18:36:52

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

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

请注意typeof(IMyInterface<>).IsAssignableFrom(typeof(IMyInterface<string>))如何返回false 。这两种类型完全不同,只共享一个通用定义,与List<int>List<string>相同,是两种不同的类型,仅共享一个通用定义。C# 泛型不是 Java 泛型。

没有通用类型可以用来包含List<string>List<int>,就像没有通用类型可用于IMyInterface<A>IMyInterface<B>一样。要么确保所有内容都是正确的泛型接口,要么创建另一个非泛型且IMyInterface<T>实现的接口。