将类字符串转换为类

时间:2011-09-02 11:47:08

标签: c# class

我在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个实体类,我想找到一种尽可能短的编写代码的方法。

3 个答案:

答案 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);