所以我做了一些实验,我发现当这个:
public class SelfOfT
{
// This won't compile
public class FailureOf<T> : T
{
}
}
失败,另一方面:
public class SelfOfT
{
public interface IMyInterface
{
}
public static void Second()
{
// This works fine, and achieves the same end as what I'm trying to do with FailureOf<T>
AssemblyName name = new AssemblyName("Dynamics");
AssemblyBuilder asmBuilder = AssemblyBuilder.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);
ModuleBuilder modbuilder = asmBuilder.DefineDynamicModule("MyModule");
TypeBuilder typeBuild = modbuilder.DefineType("SuccessfulOf", TypeAttributes.Public);
typeBuild.AddInterfaceImplementation(typeof(IMyInterface));
var TParam = typeBuild.DefineGenericParameters(new String[] { "T" }).First();
TParam.SetGenericParameterAttributes(GenericParameterAttributes.None);
Type myType = typeBuild.CreateType();
Type genericMyType = myType.MakeGenericType(typeof(IMyInterface));
IMyInterface my = (IMyInterface)Activator.CreateInstance(genericMyType);
}
}
工作好。如果我能在运行时这样做,那么在编译时使其可用似乎会节省很多麻烦。
嗯,你也不允许在运行时这样做。
注意,在您的例子中,您是而不是指定要继承的类。
要做到这一点,您需要使用一个重载DefineType,它接受一个Type
参数来继承。
但是,在运行时,您不允许为该参数指定T
,您必须指定特定的类型,这与编译时没有区别。
使用反射的代码实际上定义了:
public class SuccessfulOf<T> : IMyInterface
{
}
你不能做你想做的(class FailureOf<T> : T
),因为基本类型T
必须在编译时已知。在运行时使用反射时,您仍然不能这样做,因为必须知道T
。
因为在第二段代码中,您声明的类型是public class FailureOf<T> : IMyInterface
,而不是public class FailureOf<T> : T
。
即使在周围的类中声明泛型类型,仍然不能从它继承,因为不能继承类型参数。