2011-09-02 109 views
0

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

+1

可能的重复http://stackoverflow.com/questions/1252371/initialize-a-class-by-string-variable-in-c – Reniuz

+0

不,你的贴子不回答我的问题。 – Tomas

回答

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

UPDATE:如果你必须将对象传递给方法与泛型类型,那么你会遇到问题,因为该类型是未知在编译时。在这种情况下,我会考虑让所有的转换器,实现一个共同的接口,这样的事情:

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); 
+0

是的,我已经尝试使用您的建议代码,但我没有找到如何将T类传递给FillRequest 。你能告诉我该怎么做吗? – Tomas

+0

如果你的FillRequest方法有一个泛型类型参数,那么这是不可能的。在这种情况下,我会考虑让所有转换器实现一个通用接口并调用FillRequest (...)? – JohnD

+0

@takrl谢谢,修正 – JohnD

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)); 
+0

每个* Entity类都有自己的属性集合。我不明白在这种情况下如何使用Interface可以提供帮助。 – Tomas

+0

你的代码看起来像你正在传递一些转换器类型的名称。如果它是一个实体对象,那么在FillRequest中使用反射的第一个选项将完成这项工作 – Ankur

1

我发现代码想法here。彼得·莫里斯指出,他把代码乔恩长柄水杓书,所以如果它是有用的 - 高五到乔恩:)

创建方法:

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