xsd から生成されるクラスのインスタンスを作成する一般的なソリューションを作成する必要があります。例えば:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="PS">
<xs:complexType>
<xs:sequence>
<xs:element name="P" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="FXs" maxOccurs="1" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="FX" minOccurs="1">
<xs:complexType>
<xs:attribute name="asOfDate" type="xs:date" use="required" />
<xs:attribute name="currency" type="xs:string" use="required" />
<xs:attribute name="rate" type="xs:decimal" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="PName" type="xs:string" />
<xs:attribute name="currency" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
この xsd ランタイムからアセンブリを生成すると、クラス PS、PSP、および PSFX が含まれます。この場合、私はプロパティと何を期待するかを知っているので、createinstance と getproperties と setvalue が機能します。ポートフォリオには PortfoliosPortfolio の配列があることを知っています。
case "PS":
if (p== null)
p= myAssembly.CreateInstance(cls.FullName);
break;
case "PSP":
myClass = myAssembly.CreateInstance(cls.FullName);
myClass.GetType().GetProperty("PName").SetValue(myClass, dt.Rows[0]["PortfolioName"].ToString(), null);
myClass.GetType().GetProperty("currency").SetValue(myClass, dt.Rows[0]["Currency"].ToString(), null);
if (myClasses == null)
myClasses = Array.CreateInstance(myClass.GetType(), deals.Count());
myClasses.SetValue(myClass, l);
l++;
portfolio.GetType().GetProperty("P").SetValue(p, myClasses, null);
ここで、任意の xsd (上記だけでなく) を取り、アセンブリを生成できる汎用ソリューションが必要です。私はすでにアセンブルを生成しましたが、そこに存在するプロパティがわからないクラスにプロパティを動的に割り当てるにはどうすればよいですか? つまり、一般的なソリューションを作成するときに、クラスが別のクラスのオブジェクトのリストを使用していることをどのように知ることができるかということです。したがって、クラス名とプロパティ名をハードコーディングする代わりに、インスタンスとプロパティを取得する方法があります。上記のスニペットからわかるように、データセットの値をプロパティに割り当てています。計画では、データベースに値を columnname、attributename、parentnode として格納します。したがって、P ノードの PName 属性は列名 Pname から取得されます。コードにハードコーディングがないように設計したいと考えています。
申し訳ありませんが、ご容赦ください。意味が分からない場合はお知らせください。