2

这个问题的上下文是一个 MVC 应用程序,它接受字符串并希望将它们转换为类型并将它们传递给通用代​​码。

  • 我有一个输入类型的字符串表示形式。
  • 我似乎永远无法在泛型方法 中放入Type变量。<>
  • 这是否意味着我必须手动拼出所有可能的情况和通用方法调用?这是正确的方法吗?
  • 如果 aModelBinder能以某种方式找出我可以为 Action Method 提供泛型类型参数的类型,那就太酷了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 回答