Execution
いくつかのクラスを実行Operation
するクラスParallelizeExecution
と、単一のクラスを取得してExecution
クローンを作成しRun
、複数のExecution
インスタンスのメソッドを実行するdllライブラリTaskLibrary.dllがあります。
クラスのClone
メソッドは、 xmlをExecution
変換しExecution
、新しいインスタンスとして通常に戻すことで機能します
public Execution{
List<AOperation> operations;
public Run(){
foreach(var op in operations){
//...do stuff...
}
}
public Execution Clone(){
MyXmlSerializer.DeserializeObject<Execution>(
MyXmlSerializer.SerializeObject(this));
}
}
public ParallelizeExecution{
List<Execution> toRun;
public RunParallel(Execution e,int numExecutions){
toRun=new List<Execution>();
for(var i=0;i<numExecutions;i++){
toRun.Add(e.Clone());
}
}
}
Execution
クラスは、を実装する各クラスと同様にシリアライズ可能ですOperation
。AOperation
これは、すべてのIOperation
実装が拡張する抽象クラス( )を使用し、XmlInclude
アノテーションを使用しMyXmlSerializer
てそれぞれに対して機能することによって取得されますIOperation
。
[XmlInclude(typeof(Operation1))]
[XmlInclude(typeof(Operation2))]
public abstract class AOperation:IOperation{
...
}
これで、TaskLibrary.dllを参照する新しいプロジェクトができました。Execution
新しい種類の操作を:に追加する必要があります。
public class Operation3: Operation2 {
}
1回の実行ですべてが正常に機能しますが、使用すると、不要なメソッドを実行するようParallelizeExecution
Operation3
に正しくシリアル化されます。クラスに新しいタイプを追加して、正しくシリアル化されて実行されることを期待するにはどうすればよいですか?Operation2
Run
AOperation
Execution
Execution
また
Execution
クラスのシリアル化方法を変更せずに問題を回避するにはどうすればよいですか?
警告:Reflectionを使用して、特定のヒントを拡張する任意のヒントをxmlserializeすることが可能であることは知っていますが、標準のOOPを使用してこれを行う方法を学びたいと思います(可能な場合)。
編集: TaskLibrary.dllを変更することはできますが、このアプローチは避けたいと思います。新しいことを学び、コミュニティを支援する努力が無効になります。さらに、ライブラリをすでに使用しているユーザーに再配布するのは非常に苦痛です。