0

私は NHibernate NH-3260 のこの問題を修正しようとしており、基本クラスを参照するジェネリック インターフェイス制約を持つジェネリック メソッドのオーバーライドに固執しています。

たとえば、次のモデルがあります。

public interface IMyGenericInterface<TId>
{
}

public class MyGenericClass<TId> : IMyGenericInterface<TId>
{
    public virtual TRequestedType As<TRequestedType>() 
        where TRequestedType : MyGenericClass<TId>
    {
        return this as TRequestedType;
    }

    public virtual TRequestedType AsInterface<TRequestedType>() 
        where TRequestedType : class, IMyGenericInterface<TId>
    {
        return this as TRequestedType;
    }
}

そして、私は次のことをしようとしています

[Test]
public void GenericTypeConstraint()
{
    var type = typeof (MyGenericClass<int>);
    var method = type.GetMethod("As");

    var genericArgument = method.GetGenericArguments()[0]; // TRequestedType : MyGenericClass<TId>
    var typeConstraint = genericArgument.GetGenericParameterConstraints()[0]; // MyGenericClass<TId>

    Assert.AreEqual(typeof(MyGenericClass<>), 
                    typeConstraint); // This works
}

[Test]
public void GenericInterfaceConstraint()
{
    var type = typeof (MyGenericClass<int>);
    var method = type.GetMethod("AsInterface");

    var genericArgument = method.GetGenericArguments()[0]; // TRequestedType : class, IMyGenericInterface<TId>
    var typeConstraint = genericArgument.GetGenericParameterConstraints()[0]; // IMyGenericInterface<TId>

    Assert.AreEqual(typeof (IMyGenericInterface<>), 
                    typeConstraint); // Fails with 

    /*
    Expected: <NHibernate.Test.DynamicProxyTests.GenericMethodsTests.IMyGenericInterface`1[TId]>
    But was:  <NHibernate.Test.DynamicProxyTests.GenericMethodsTests.IMyGenericInterface`1[TId]>
    */
}
4

1 に答える 1

3

これはtypeof (IMyGenericInterface<>)、期待値として指定するためです。これはオープン ジェネリック ( IsGenericTypeDefinition = true) です。ただし、typeConstraintクローズ ジェネリック ( IsGenericTypeDefinition = false) です。

テストに合格するには、アサートを次のように変更します。

Assert.AreEqual(typeof (IMyGenericInterface<>),
                typeConstraint.GetGenericTypeDefinition());
于 2013-06-04T10:17:20.627 に答える