如何从类型名称字符串转换为泛型
本文关键字:字符串 转换 泛型 类型 | 更新日期: 2023-09-27 18:36:24
这个问题的上下文是一个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
}
如果你只有类型,那么你必须通过反射来全部。 假设"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);
}
这应该对你有用,尽管你应该注意,它不会很漂亮! ;)
由于您不是实际调用DoSomething
的人,因为它是一个控制器方法,因此无法将类型分配给该方法,例如:
public ActionResult DoSomething<T>(int? id)
由于调用该方法的是 IIS,因此无法分配此类型。现在我对路由一无所知,所以也许可以通过路由来实现,但对我来说似乎不太可能。看起来你正在使用枚举,所以也许你可以使用枚举。解析以实例化或创建 int 的扩展方法,该方法能够根据类型确定它。