0

少し恥ずかしい質問のタイトルで申し訳ありませんが、状況をより明確に説明する方法がわかりませんでした。

たとえば、次の 4 つのクラスがあるとします。

public class CustomModel
{
    public string Value1 { get; set; }
}

public class CustomModel2 : CustomModel
{

}

public class CustomViewModel<T> where T : CustomModel
{

}

public class PageOfType<T, TT> where T : CustomViewModel<TT> where TT : CustomModel
{
    public TT Model { get; set; }  
    public T ViewModel { get; set; }
}

したがって、アイデアは非常に単純です。PageOfTypeタイプのプロパティが必要is an argument of typeですis an argument for itself

したがって、インスタンス化は次のようになります (これは少し複雑で、開発プロセスではあまりうまく使用されません)。

var p0 = new PageOfType<CustomViewModel<CustomModel>, CustomModel>();
var p1 = new PageOfType<CustomViewModel<CustomModel>, CustomModel2>();
// ^^ this line gives an error as, obviously, CustomViewModel<CustomModel> and CustomViewModel<CustomModel2> are not convertable

p0.Model.Value1 = "some string"; // <- this line is perfectly what I need (it works)

それで、あなたは私に何か手がかりを与えることができますか:

  • 代わりに、単にこのようなものを用意するために、そのすべての「キッチン」をどのように配置する必要がありますか(つまり、初期化で2 回は言うまでもありませんCustomModel)。

    var p0 = new PageOfType<CustomViewModel<CustomModel>>();
    // or even having new PageOfType<CustomViewModel2>(); 
    // (if CustomViewModel2 is just as:
    // public class CustomViewModel2 : CustomViewModel<CustomModel>
    // for instance)
    
  • これで変換可能なエラーを処理するにはどうすればよいですか (別の選択肢がない限り、この状況でインターフェイスを簡単に使用できるかどうかわからないため):

    var p1 = new PageOfType<CustomViewModel<CustomModel>, CustomModel2>();
    // ^^ this line gives an error as...
    
4

1 に答える 1

0

クラスの代わりに共変インターフェイスを使用する必要があります。ICustomViewModel<out TModel>

http://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx

于 2013-11-11T01:30:25.940 に答える