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に正しくシリアル化されます。クラスに新しいタイプを追加して、正しくシリアル化されて実行されることを期待するにはどうすればよいですか?Operation2RunAOperationExecutionExecution
また
Executionクラスのシリアル化方法を変更せずに問題を回避するにはどうすればよいですか?
警告:Reflectionを使用して、特定のヒントを拡張する任意のヒントをxmlserializeすることが可能であることは知っていますが、標準のOOPを使用してこれを行う方法を学びたいと思います(可能な場合)。
編集: TaskLibrary.dllを変更することはできますが、このアプローチは避けたいと思います。新しいことを学び、コミュニティを支援する努力が無効になります。さらに、ライブラリをすでに使用しているユーザーに再配布するのは非常に苦痛です。