2017-08-10 19 views
0

私は次のことを成功させるために努力しています。私はIHandle<>インタフェースのパラメータとしてジェネリッククラスを使用したい:-(ここでのサンプルコードは次のとおりです。caliburn.microのIHandle <>でパラメータとしてgenenricクラスを使用する方法?

public interface Message<T> 
{ 
    T Payload { get; set; } 
} 

... 

public MyViewModel : Screen, IHandle<IMessage<T>> 
{ 
    ... 
    public void Handle(IMessage<T> message) 
    { 
     .... 
    } 
} 

質問です:どのように私は正しい方法でIHandleを宣言しないまたは私は必要なのでしょうか?

が、私は時間のため、この問題を解決しようとにより、私が取得狂気の最良の方法によという事実に。

以来、私は私の心の中だけのブロックを持っていると思う?それは IHandleHandle()を所有し、各 Tに指定します

ご協力ありがとうございます。

更新:私が何をしたいのかを示すために、私は2つの可能な限り良いソリューションを追加しました。

考えられる解決策1:

public MyViewModel : Screen, IHandle<IMessage<String>>, IHandle<IMessage<Int32>> 

のように。この問題は、新しいTをサポートする必要がある場合、ViewModelを編集する必要があることです。この場合、汎用コードIMessageをスキップして、具体的なメッセージ(例えば、IStringMessage、など)を作成すると、コードを読みやすくしますが、使用する各タイプに結合することができます。

解決策2:

public MyViewModel : Screen, IHandle<IMessage> 

とにIMessageを変更します。

public interface IMessage 
{ 
    Object Payload { get; set; } 
} 

これは、仕事をすることができますが、私はPayloadのtypesaftyを失います。オプションのTypeOfPayloadプロパティを追加することもできますが、私が探しているソリューションではありません。

+0

はあなたへの一般的なパラメータを提供する必要がありますか 'IHandleは、<>' 'MyViewModel'でそれを実装するとき?そうでなければ、単に 'IHandler >'をしないのはなぜですか? – kuskmen

+0

これまでのお返事ありがとうございますが、私はviewmodel自体を一般的にすることはできません。私はメッセージを汎用的に扱わせたいと思っており、それぞれのメソッドを持つことを避けようとしています。。 – Matthias

答えて

0

私はあなたがこれらの要件を探していると思う:

1)あなたは「人のメッセージ」

2のように、指定された型のメッセージを必要とする)あなたが与えられた型のハンドラを必要とします「人のハンドラ」のように、そのメッセージが、

あなたはこのようなインタフェースを記述することができます。

public interface IHandle<T> 
{ 
    void Handle(IMessage<T> message); 
} 
public interface IMessage<T> 
{ 
    T Payload { get; set; } 
} 
+0

あなたの応答にもありがとう。しかし、私はジェネリックメッセージのハンドラが必要です。問題をより良い方法で説明するために質問を更新しました。 – Matthias

+0

しかし、このハンドラは(ジェネリックメッセージ(タイプ 'T'の)ためのものです)。あなたの要件は、このソリューションでは取り込まれませんか? – larsbe

+0

いいえ、ハンドラーは 'Message 'のタイプであり、 'T'ではありません。また、IHandleインターフェースはCaliburn.Microによって定義されています。あなたの前提の両方は、私がしたいことではありません。だから私は私の質問に新しい情報を追加しました。お返事をありがとうございます!メソッドがあまりにも一般的なものである必要があります。ViewModelの 'T'を指定せずに' Message 'を処理できるはずです。 – Matthias

0

ご確認ください。あなたがMyViewModelのインスタンスを作成する必要がある場合は

interface IHandle<T> 
    { 
     T Handle { get; set; } 
    } 
    public interface Message<T> 
    { 
     T Payload { get; set; } 
    } 

    public class MyViewModel <T>: IHandle<T> 
    { 
     public T Handle { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } 
    } 

MyViewModel<YourClassName> model=new MyViewModel<YourClassName>(); 
+0

あなたの返事をありがとうが、それはトリックを行いません。 'IHandle'はCaliburn.Microによって定義され、ハンドラーは' Message'を扱わなくてはなりません。 'Message 'は 'T'ではありません。 – Matthias

関連する問題