0

XSD.exe によって XSD から生成された一連のクラスがあります。CSV ファイルからデータを読み取って、これらのクラスのフィールドの一部を動的に入力しようとしています。私が抱えている問題は、他の生成されたクラスを表すプロパティは、ルート オブジェクトの作成時にインスタンス化されないため、単に null になることです。

たとえば、Sub_Message 型のプロパティ「field1」を持つルート ドキュメント Main_Message のインスタンス「doc」を作成すると、doc.field1 は null になるため、doc.field1.name を設定しようとすると、例外が発生します。 .

この問題を解決する方法について私が最初に考えたのは、これらのオブジェクト プロパティに対して create-on-read を実行することです。生成されたクラスは部分クラスであるため、プロパティ ゲッターを変更して、生成されたクラスごとに手動でこれを行うことができます。しかし、私は本当にそのアプローチを避けたいと思っています。生成されたクラスはたくさんありますが、XSD が変更されるたびに変更したバージョンを維持する必要はありません。

次に考えたのは、CSV データを読み取っているコード内のクラスの外部で読み取り時に作成を行うことでした。最初にプロパティを読み取り、それが null の場合は、クラスのインスタンスを作成してそのプロパティに割り当て、そのプロパティにフィールドを設定します。しかし、私はそれを行う方法がわかりません。Activator.CreateInstance(propertyType) を使用してクラスのインスタンスを作成することはできますが、それは基本的なオブジェクト参照を返します。これはキャストなしではプロパティに割り当てることができません。ただし、コンパイル時に型名がないため、そのキャストを行うことはできません。

そのため、これらの生成されたクラスを処理して CSV ファイルからフィールド値を読み取り、ドキュメント オブジェクトのフィールドにデータを入力し、それらを使用して XML を作成する方法を見つけようとしています。私はそれを行う方法について現時点で困惑しています。

4

1 に答える 1

0

よく検索した後、実用的な解決策を見つけました。

public static T Cast<T>(object o)
{
  return (T)o;
}

obj = Activator.CreateInstance(prop.PropertyType);
MethodInfo castMethod = typeof(MainClass).GetMethod("Cast").MakeGenericMethod(prop.PropertyType);
prop.SetValue(parent, castMethod.Invoke(null, new object[] { obj }), null);

そのため、実行時に必要に応じてプロパティを作成して割り当てることができます。

于 2012-10-02T21:28:33.140 に答える