运行时的C#泛型类型

时间:2012-07-24 15:39:14

标签: c# generics types

我正在尝试动态生成报告并将它们通过电子邮件发送给相应的用户,这是可能的,还是编译器在运行之前需要该类型。

static void Main(string[] args) {
    ArrayList ReportsTypes = new ArrayList();
    ReportsTypes.Add(typeof(AgentPPL));
    foreach(Type t in ReportsTypes) {
        InitilizeReports<t>(); // <- Error
    }
}
static void InitilizeReports<T>() where T : new() {
    T r = new T();
    IReportDocument rd = (IReportDocument)r;
    rd.DocumentName = "SomeReport";
    ExportReport(rd);
}

我真正想做的是从数据库中获取一个字符串并将字符串转换为类型但我怀疑这是可能的但是如何在我的示例中创建类型数组在这里做错了什么。任何帮助都非常感谢我一直在旋转我的车轮只是为了让模板工作。

4 个答案:

答案 0 :(得分:1)

您可以使用以下方法之一:

ReportGenerator generator = new ReportGenerator();
// 1. Invoke method with single parameter
foreach(Type t in ReportsTypes) {
    generator.InitilizeReportsByType(t);
}
// 2. Make and invoke generic method without parameter via reflection
MethodInfo mInfo = typeof(ReportGenerator).GetMethod("InitilizeReportsGeneric");
foreach(Type t in ReportsTypes) {
    MethodInfo genericMethod = mInfo.MakeGenericMethod(new Type[] { t });
    genericMethod.Invoke(generator, new object[] { });
}


public class ReportGenerator {
    public void InitilizeReportsByType(Type type) {
        IReportDocument reportDocument = (IReportDocument)Activator.CreateInstance(type);
        //...
    }
    public void InitilizeReportsGeneric<T>() where T : IReportDocument, new() {
        T reportDocument = new T();
        //...
    }
}

注意,T reportDocument = new T()等于Activator.CreateInstance(type),因为它只是编译器语法糖。

答案 1 :(得分:0)

您可以使用 Type.GetType(string typeName)

将字符串转换为类型
Type intType = Type.GetType("System.Int32");

答案 2 :(得分:0)

您可以从字符串创建类的实例,如下所示:

Type reportType = Type.GetType("ClassName.Including.Namespace");
IReportDocument report = (IReportDocument)Activator.CreateInstance(reportType);

答案 3 :(得分:0)

您可以稍微修改一下代码并改为使用反射:

static void Main(string[] args)
{
    ArrayList ReportsTypes = new ArrayList();
    ReportsTypes.Add(typeof(AgentPPL));


    foreach (Type t in ReportsTypes)
    {
        InitilizeReports(t);
    }


}

static void InitilizeReports(Type t)
{
    var r = Activator.CreateInstance(t);
    AgentPPL rr = new AgentPPL();
    IReportDocument rd = (IReportDocument)r;
    rd.DocumentName = "SomeReport";
    ExportReport(rd);
}