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へのオーバーロードの 1 つを使用する必要があります。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> : IMyInterface2番目のコードでは、タイプではなくタイプを宣言しているためpublic class FailureOf<T> : Tです。

周囲のクラスでジェネリック型を宣言しても、型パラメーターを継承できないため、それを継承することはできません。

于 2013-03-23T16:54:22.617 に答える