如何从typeName字符串转换为泛型?

时间:2012-06-04 22:27:08

标签: c# asp.net asp.net-mvc asp.net-mvc-3 generics

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

  • 我有一个输入类型的字符串表示。
  • 我似乎无法在Type内放置<>变量用于泛型方法。
  • 这是否意味着我必须手动拼出所有可能的案例和通用方法调用?这是正确的方法吗?
  • 如果ModelBinder能够以某种方式找出我可以拥有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
}

2 个答案:

答案 0 :(得分: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);
}

那应该适合你,虽然你应该注意,它不会很漂亮! ;)

答案 1 :(得分:1)

由于您不是实际调用DoSomething的人,因为它是控制器方法,因此无法将类型分配给方法,例如:

public ActionResult DoSomething<T>(int? id)

由于它是调用该方法的IIS,因此您没有任何方式来分配此类型。现在我不知道有关路由的所有信息,所以也许它可以用路由,但对我来说似乎不太可能。看起来你正在使用枚举,所以也许你可以使用enum.Parse来实例化或创建一个能够根据类型确定它的int的扩展方法。