2017-04-07 4 views
2

からメイクジェネリック戻り値の型にとりうるジェネリック型を必要とするメソッドを作成することも可能であり、そしてその後、戻り値の型はこのは、メンバー

よう

何か特定のタイプのメンバーに基づいています

class ExampleClass 
{ 
    public T.ReturnType Send<T>() where T : ClassWithType 
    { 
     ... 
    } 
} 

abstract class ClassWithType 
{ 
    internal abstract Type ReturnType { get; } 
} 

もし、それができないのであれば、良い選択肢になるでしょう。事前に

おかげ

+3

ここで何をしようとしているのか分かりません。より具体的な例が役立つかもしれません。私。あなたは代替案を尋ねますが、実際の問題が解決されていることを理解するのに十分な情報はここにありません。 –

+0

タイプが必要なメソッドを作成したいと思います。与えられた型に基づいてオブジェクトを返します。 –

+0

また、genericsは単一の形式にコンパイルされていることに注意してください - 現時点では、 'ClassWithType'はプロパティがアクセスされるたびに* different *' Type'を返すことができます。 *。確かにうまくいくわけではありません。 –

答えて

2

それはあなたがソケットを介してパケットを送信したいとコメントし、各パケットは異なる戻り値の型を持っているので - あなたは、パケットクラス自体に戻り値の型をエンコードすることができます。そして、

public abstract class Packet<TResponse> { 
    // other members here 
    public abstract TResponse DecodeResponse(byte[] raw); 
} 

public class IntPacket : Packet<int> { 
    public override int DecodeResponse(byte[] raw) { 
     // decode 
     return 0; 
    } 
} 

あなたのSendメソッドは次のようになります。

static TResponse Send<TResponse>(Packet<TResponse> packet) { 
    // send, got response 
    byte[] raw = GetResponse(); 
    return packet.DecodeResponse(raw); 
} 

、通話だけで次のようになります。

int response = Send(new IntPacket()); 
+0

これは可能であるかどうかわかりませんでした。これは可能ですか? 'int response = Send(new IntPacket());'の代わりに 'int response = Send (new IntPacket());' –

+1

この特定のSendメソッド)、コンパイラは 'IntPacket'が' Packet 'であることを知っているので、型を推測することができます。コンパイラがそれを行うことができない場合(または理論上可能ですが、さまざまな理由でコンパイラはそれをしません)、ケースがあります。そのような場合は、自分でタイプを提供する必要があります。 – Evk

関連する問題