2

この質問のコンテキストは、文字列を取得し、うまくいけばそれらを型に変換してジェネリックコードに渡すMVCアプリです。

  • 入力用のタイプの文字列表現があります。
  • ジェネリックメソッド のType変数をの中に入れることはできないようです。<>
  • それは、考えられるすべてのケースとジェネリックメソッド呼び出しを手動で説明する必要があることを意味しますか?それはこれを行う正しい方法ですか?
  • ModelBinderアクションメソッドのジェネリック型パラメーターを持つことができる場所で、何らかの方法で型を理解できれば素晴らしいと思いますpublic ActionResult Something<T>()。しかし、それが可能かどうかはわかりません。

public ActionResult DoSomething(string typeName, int? id)
{
    var type = Type.GetType(typeName);
    if (type == typeof(Apple)) DoSomethingElse<Apple>(id);
    if (type == typeof(Orange)) DoSomethingElse<Orange>(id);
    //if etc ... to infinity
}
4

2 に答える 2

1

タイプしかない場合は、リフレクションを介してすべてを取得する必要があります。「DoSomethingElse」が現在のクラスのメソッドであると仮定します。

public ActionResult DoSomething(string typeName, int? id)
{
    Type thisType = this.GetType(); // Get your current class type
    var type = Type.GetType(typeName);
    MethodInfo doSomethingElseInfo = thisType.GetMethod("DoSomethingElse");
    MethodInfo concreteDoSomethingElse = doSomethingElseInfo.MakeGenericMethod(type);
    concreteDoSomething.Invoke(this, null);
}

それはうまくいくはずですが、注意してください。;)

于 2012-06-04T22:44:26.687 に答える
1

コントローラーメソッドであるため、実際に呼び出すのはあなたではないため、次DoSomethingのようなメソッドに型を割り当てる方法はありません。

public ActionResult DoSomething<T>(int? id)

メソッドを呼び出すのは IIS であるため、この型を割り当てる方法はありません。現在、ルーティングについてすべてを知っているわけではないので、ルーティングで可能かもしれませんが、私にはありそうにありません。列挙型を使用しているように見えるので、おそらく enum.Parse を使用して、型に基づいて決定できる int への拡張メソッドをインスタンス化または作成できます。

于 2012-06-04T22:54:31.843 に答える