为什么我可以在运行时继承泛型类型,但不能继承编译时间?

时间:2013-03-23 16:47:07

标签: c# generics reflection reflection.emit

所以我正在做一些实验,我发现这一点:

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);

    }
}

工作正常。如果我能在运行时完成它,似乎可以省去很多麻烦,只需在编译时使它可用。

3 个答案:

答案 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

即使您在周围的类中声明泛型类型,仍然无法继承它,因为您无法继承类型参数。