所以我正在做一些实验,我发现这一点:
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);
}
}
工作正常。如果我能在运行时完成它,似乎可以省去很多麻烦,只需在编译时使它可用。
答案 0 :(得分:4)
嗯,你也不允许在运行时这样做。
请注意,在您的情况下,您不指定要继承的类。
要做到这一点,您需要使用DefineType之一的重载来接受Type
参数。
但是,在运行时,您不能为该参数指定T
,您必须指定特定的类型,这与编译时间没有区别。
答案 1 :(得分:3)
使用反射的代码实际上定义了这个:
public class SuccessfulOf<T> : IMyInterface
{
}
您无法执行所需的操作(class FailureOf<T> : T
),因为必须在编译时知道基本类型T
。在使用反射的运行时,您仍然无法执行此操作,因为必须知道T
。
答案 2 :(得分:1)
因为在第二个代码中,您声明的是public class FailureOf<T> : IMyInterface
类型,而不是public class FailureOf<T> : T
。
即使您在周围的类中声明泛型类型,仍然无法继承它,因为您无法继承类型参数。