【问题标题】:convert class string to class将类字符串转换为类
【发布时间】:2011-09-02 11:47:08
【问题描述】:

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

【问题讨论】:

标签: c# class


【解决方案1】:

这是不可能的,因为泛型类型需要在编译时指定。 您可以做的是将 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));

【讨论】:

  • 每个 *Entity 类都有自己的属性集合。我不明白在这种情况下如何使用接口。
  • 您的代码看起来像是在传递一些转换器类型名称。如果它是一个实体对象,那么在 FillRequest 中使用反射的第一个选项就可以完成这项工作
【解决方案2】:

是的,看看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);

【讨论】:

  • 是的,我已经尝试使用您建议的代码,但我没有找到如何将类类型作为 T 传递给 FillRequest。你能告诉我怎么做吗?
  • 如果您的 FillRequest 方法具有泛型类型参数,那么这将是不可能的。在这种情况下,我会考虑让您的所有转换器实现一个通用接口并调用 FillRequest(...)?
【解决方案3】:

我找到了代码创意here。 Peter Moris 指出他从 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);

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 2011-05-24
    • 1970-01-01
    • 2011-12-17
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多