1

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

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

4 回答 4

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)因为它只是编译器语法糖。

于 2012-07-24T15:52:33.580 回答
0

您可以使用Type.GetType(string typeName)将字符串转换为类型:

Type intType = Type.GetType("System.Int32");
于 2012-07-24T15:43:20.717 回答
0

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

Type reportType = Type.GetType("ClassName.Including.Namespace");
IReportDocument report = (IReportDocument)Activator.CreateInstance(reportType);
于 2012-07-24T15:44:13.133 回答
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);
}
于 2012-07-24T15:45:34.453 回答