反射表单使用通用接口创建实例
本文关键字:创建 实例 接口 反射 表单 | 更新日期: 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>
实现的接口。