0

以下のコードを見てください。

public class BaseClass
{
}

public class SubClass : BaseClass
{
}

public class QueryClass
{
    public TBaseClass[] QueryBase<TBaseClass>() where TBaseClass : BaseClass
    {
        throw new NotImplementedException();
    }

    public TSubClass[] QuerySub<TSubClass>() where TSubClass : SubClass
    {
        throw new NotImplementedException();
    }

    public TClass[] Query<TClass>() where TClass : BaseClass
    {
        if (typeof(TClass).IsSubclassOf(typeof(SubClass)))
        {
            return QuerySub<TClass>(); // there is error The type 'TClass' must be convertible to SubClass
        }

        return QueryBase<TClass>();
    }
}

問題は、Query メソッドをどのように実装するかです。もし可能ならば..

4

2 に答える 2

1

あなたがやろうとしていることは、次のようなことです:

public class Animal { }
public class Dog : Animal { }

public void HandleAnimal<T>() where T : Animal
{

}
public void HandleDog<T>() where T : Dog
{

}

この場合の参照がある場合、それが何の動物であるAnimalかを知る方法はありません。typeofメソッドが true を返したとしても、コードのコンテキストでは常に anであり、型が an であることがわかっている場合はAnimala を処理できません。メソッド内でオブジェクトのインスタンスを処理している場合、それがサブクラスであることがわかっている場合は、キャストまたはインスタンス化を開始してから渡すことができます。doganimalsubclass

于 2012-12-10T14:36:02.900 に答える
0

反省で終わりました。

        if (typeof(TClass).IsSubclassOf(typeof(SubClass)))
        {
            var method = typeof(QueryClass).GetMethod("QuerySub").MakeGenericMethod(typeof (TClass));

            return (TClass[]) method.Invoke(this, new object[0]);
        }
于 2012-12-10T15:54:19.677 に答える