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都需要在两个项目都引用的程序集中声明。这不太可能是一个正确的方法。