0

所以我做了一些实验,我发现虽然这样:

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

    }
}

工作正常。如果我无论如何都可以在运行时做到这一点,那么在编译时让它可用似乎会节省很多麻烦。

4

3 回答 3

4

嗯,你也不允许在运行时这样做。

请注意,在您的情况下,您没有指定要继承的类。

为此,您需要使用DefineType的重载之一,该重载采用Type要继承的参数。

但是,在运行时,您不能T为该参数指定任何一个,您必须指定特定类型,这与编译时没有区别。

于 2013-03-23T16:51:08.740 回答
3

您使用反射的代码实际上定义了这一点:

public class SuccessfulOf<T> : IMyInterface
{

}

你不能做你想做的事 ( class FailureOf<T> : T) 因为T在编译时必须知道基本类型。在运行时反射你仍然不能这样做,因为T必须知道。

于 2013-03-23T16:50:56.960 回答
1

因为在第二个代码中您声明的是类型public class FailureOf<T> : IMyInterface,而不是public class FailureOf<T> : T

即使你在周围的类中声明了泛型类型,你仍然不能从它继承,因为你不能继承类型参数。

于 2013-03-23T16:54:22.617 回答