0

ですから、私の実際の方法は大きく異なりますが、私はこれに行き着きます。<T>ジェネリックメソッドを使用しているときに、ジェネリック型を処理する方法を完全に理解していないようです。私の理解では、同じロジックを異なるタイプで機能させたい場合はジェネリックメソッドを使用しますが、実行時に正確なタイプを自由に決定できるようにしたいのです。ですから、私がこのような方法を持っているとき、それは私にはかなり自然に思えます:

internal static void ChangeCode<T>(Entity entity) where T : Entity
{

    T tempEntity;

    if (entity.GetType() == typeof(SomeMoreSpecificEntity))
    {
      tempEntity = new SomeMoreSpecificEntity();
    }
}

ただし、このようなことをしようとすると、エラーが発生しますCan not convert type T to SomeMoreSpecificEntity

だから私はどこが間違っているのですか。これを正確に実行できるようにするという考えではありませんか?コンパイル時に共通の型を宣言し、実行時により具体的な型にキャストしますか?

4

3 に答える 3

4

あなたはそれをすることはできません。次の状況を確認してください。

SomeMoreSpecificEntity2次のように宣言された名前の別のクラスがあります。

class SomeMoreSpecificEntity2 : Entity
{
}

あなたはあなたのメソッドを呼び出しますChangeCode<SomeMoreSpecificEntity2>、そうTですSomeMoreSpecificEntity2、そうtempEntityですSomeMoreSpecificEntity2、しかしあなたはそれに割り当てようとしSomeMoreSpecificEntityています。それはうまくいきません。

次のように変更してみてください:

internal static void ChangeCode<T>(Entity entity) where T : Entity
{
    Entity tempEntity;

    if (entity.GetType() == typeof(SomeMoreSpecificEntity))
    {
        tempEntity = new SomeMoreSpecificEntity();
    }
}

コンパイルします。

于 2013-03-26T10:40:49.103 に答える
3

いいえ、書き込もうとしているコードは壊れています。たとえば、次のように呼び出したとします。

ChangeCode<BananaEntity>(new SomeMoreSpecificEntity());

SomeMoreSpecificEntityこれは、型の参照を型の変数に割り当てようとします。Tここで、TはですBananaEntity

何を達成しようとしているのかは明確ではありませんが、それが現在のコードがコンパイルされない理由です。それが機能しない目的以外で実際に使用していない場合、現在のコードを 非ジェネリックメソッドに変更して、型として宣言することができます。もちろん、それはあなたが本当にやりたいことにはうまくいかないかもしれませんが、あなたは機能しないコードを提供しただけなので、それを決定するのは難しいです:(TtempEntityEntity

この線についての3つのポイント:

if (entity.GetType() == typeof(SomeMoreSpecificEntity))
  • あなたは実際entityにタイプTではなくタイプであることを意味しましたEntityか?現在、どのエンティティでもかまいません
  • 本当に正確なタイプを確認したいですか?通常はis、呼び出しGetTypeてタイプと直接比較する代わりに使用します
  • 通常、このようなタイプを比較することは、再設計を検討する必要があることを示しています。現時点では、ハードコーディングされている型のみを処理するため、ジェネリックではありません。
于 2013-03-26T10:40:06.883 に答える
-3
tempEntity = (T)(object)new SomeMoreSpecificEntity();

Tはオブジェクトでのみキャストできます

于 2013-03-26T10:44:43.793 に答える