2017-05-05 7 views
0

私はこの質問の良いタイトルを実際に見つけることはできませんが、次のようになります。私はクラスとそのクラスのインスタンスを識別する状況に自分自身を見つける。私が持っている解決策は、クラスの値とconstのインスタンスの値を返すプロパティを使用することです。派生クラスとインスタンスを一方向に識別する

もっと良い解決策があるかどうかわかりません。値を特定して再利用するには2つの方法が必要なのはちょっと奇妙です。より良い方法がありますか?

下記の疑似コード。実際のアプリケーションでは、基底クラスから派生したクラスがさらにあり、objectsリストにはこれらのインスタンスも含まれます。デシリアライゼーションは、起動時に行われ、ユーザー活動のためにリストが変更された後のシャットダウン時にシリアル化されます。

static void Main(string[] args) 
{ 
    List<Base> objects = new List<Base>(); 
    List<string> serializationIds = new List<string>(); 
    // SerializationIds initialized somehow 
    foreach (var serializationId in serializationIds) 
    { 
     switch(serializationId) 
     { 
      // Identify class 
      case Derived.SerializationIdText: 
       objects.Add(new Derived()); 
       break; 
     } 
    } 

    // add remove objects 

    foreach (var item in objects) 
    { 
     // Identify instance 
     string serializationId = item.SerializationId; 
     // Do something with serializationId; 
    } 
} 

public abstract class Base 
{ 
    public string SerializationId { get; set; } 
} 

public class Derived : Base 
{ 
    public const string SerializationIdText = "DatabaseExplorer"; 
    public Derived() 
    { 
     SerializationId = SerializationIdText; 
    } 
} 
+0

のようなものを持っていることができるように、「私は、私はクラスを識別したい状況で自分自身を見つけ、あまりにも、switchステートメント内のコードをリファクタリングすることができるかもしれないとクラスのインスタンスです。 " - もっと深く行こう。なぜあなたはこれをしたいのですか?たぶんあなたの根本的な問題を解決する良い方法があります。 –

+0

これは基本的に私の問題です。実際のアプリケーションはより複雑ですが、基本的な問題はこの直列化の問題です。ここでは、逆シリアル化できるようにシリアル化するものを特定する必要があります。 –

+0

シリアル化時にストリームにID(クラス用)とデータ(インスタンス用)を格納しています。逆シリアル化時には、IDとデータを魔法のようにインスタンスに戻す必要があります正しいクラスの...? –

答えて

0

2回繰り返すのではなく、最初の最初のループで2番目のループの機能を実行しないでください。

static void Main(string[] args) 
{ 
    List<Base> objects = new List<Base>(); 
    List<string> serializationIds = new List<string>(); 
    // SerializationIds initialized somehow 
    foreach (var serializationId in serializationIds) 
    { 
     switch(serializationId) 
     { 
      // Identify class 
      case Derived.SerializationIdText: 
       string serializationId = item.SerializationId; 
       // Do something with serializationId; 
       break; 
     } 
    } 
} 

あなたは

static void Main(string[] args) 
{ 
    List<Base> objects = new List<Base>(); 
    List<string> serializationIds = new List<string>(); 
    // SerializationIds initialized somehow 
    foreach (var serializationId in serializationIds) 
    { 
     string serializationId = item.SerializationId; 
     // Do something with serializationId; 
    } 
} 
+0

例を単純化しすぎています。たぶん私は、派生クラスが増えるほど十分に明確ではなかったでしょう。私は質問を更新します。 –

関連する問題