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 に答える