我在ASP.NET应用程序中有以下代码,我想将converterName
变量转换为
类并将其传递给FillRequest<T>
方法。
可能吗?
var converterName = HttpContext.Current.Items["ConverterName"] as string;
FillRequest<Web2ImageEntity>(Request.Params);
或者我可以做
var converterName = HttpContext.Current.Items["ConverterName"] as string;
if (converterName == "Web2ImageEntity")
FillRequest<Web2ImageEntity>(Request.Params);
但我有大约20个实体类,我想找到一种尽可能短的编写代码的方法。
答案 0 :(得分:4)
这是不可能的,因为需要在编译时指定泛型类型。 你可以做的是将FillRequest方法更改为如下所示,然后使用反射来执行所需的任务
FillRequest(string[] params,Type converter)
{
//Create object from converter type and call the req method
}
或者让FillRequest采用接口
FillRequest(string[] params, IConverter c)
{
//call c methods to convert
}
调用此类似于:
var type = Type.GetType(converterName);
FillRequest(Request.Params,(IConverter)Activator.CreateInstance(type));
答案 1 :(得分:1)
是的,看一下Activator.CreateInstance():
var converterName = HttpContext.Current.Items["ConverterName"] as string;
var type = Type.GetType(converterName);
var yourObject = Activator.CreateInstance(type);
请注意,该类型必须具有公共无参数构造函数。这是MSDN文档的链接;有一堆重载可能对你有用:
http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
更新:如果必须将对象传递给具有泛型类型的方法,那么您将遇到问题,因为在编译时不知道该类型。在这种情况下,我会考虑让所有转换器实现一个通用接口,如下所示:
var converterName = HttpContext.Current.Items["ConverterName"] as string;
var type = Type.GetType(converterName);
var yourObject = Activator.CreateInstance(type) as IMyConverter;
if (yourObject != null)
FillRequest<IMyConverter>(yourObject);
答案 2 :(得分:1)
我找到了代码构思here。彼得·莫里斯指出,他从Jon Skeets的书中获取了代码,所以如果它有用的话 - 对Jon来说是高五:)
创建方法:
public void DoFillRequest(Type type, string[] params)
{
MethodInfo methodInfo = this.GetType().GetMethod("FillRequest");
MethodInfo genericMethodInfo = methodInfo.MakeGenericMethod(new Type[]{ type });
genericMethodInfo.Invoke(this, new object[]{ params });
}
现在称之为:
var type = Type.GetType(converterName);
DoFillRequest(type, Request.Params);