2016-04-08 12 views
1

Ich habe die folgende Implementierung für den Vergleich zweier Objekte.get Objekt der Klasse basierend auf der generischen Schnittstelle

public interface IEqualityDefinition<T> 
{ 
    bool Compare(object source, T target); 
} 

public class BlockEqualityDefinition : IEqualityDefinition<Block> 
{ 
    public bool Compare(object source, Block target) 
    { 
     // compare stuff.. 
     return false; 
    } 
} 

Ich verwendete eine generische Schnittstelle, um anzugeben, für welche Klasse ich vergleichen möchte. Als nächstes habe ich die folgende Methode:

public bool Compare(object source, object target) 
{ 
    // Here i want something else 
    IEqualityDefinition definition = new BlockEqualityDefinition(); 

    return definition.Compare(source, target); 
} 

Bei diesem Verfahren möchte ich eine Klasse instanziiert basierend auf dem ‚Ziel‘ Parameter. Wenn zum Beispiel der Parameter 'target' ein Objekt 'Block' enthält, möchte ich, dass die richtige EqualityDefinition-Klasse aufgerufen wird, um das Vergleichsmaterial für mich zu erstellen.

Was ist der beste Weg, dies zu tun? Ich kann es jetzt nicht herausfinden. Vielen Dank für Ihre Hilfe!

Antwort

0

Zwei Optionen aus der Spitze von meinem Kopf:

  • Karte in Code erstellen, wo Sie Ihre Implementierungen speichern

    Dictionary<Type, IEqualityDefinition> 
    

    Fügen Sie Ihre Implementierungen es

    EqualityMap.Add(typeof(Block), new BlockEqualityDefinition) 
    

    Und Abfrage nach dem Typ, den Sie hinzufügen.

    EqualityMap[target.GetType()] 
    
  • Oder haben eine Schnittstelle alle geladenen Baugruppen für Typen für das Scannen des wollte imlementing. Wie in How do i get a list of all loaded types in C#

    Um nicht immer alle geladenen Typen zu scannen, speichern Sie diese in einer Karte wie in der ersten Option.

0

Sie sollten in Fabriken schauen. Das Factory-Muster ermöglicht genau das.

(Eigentlich nicht so gut) Beispiel aus here:

class Factory 
{ 
    /// <summary> 
    /// Decides which class to instantiate. 
    /// </summary> 
    public static Position Get(int id) 
    { 
     switch (id) 
     { 
     case 0: 
      return new Manager(); 
     case 1: 
     case 2: 
      return new Clerk(); 
     case 3: 
     default: 
      return new Programmer(); 
     } 
    } 
} 

Aber in Ihrem Fall (eigentlich in den meisten Fällen) Ich würde sagen, dass Sie eine Enumeration anstelle eines int verwenden sollte - es ist besser, Refactoring, zu verstehen und zu lesen:

public enum EqualityDefinitions 
{ 
    Block // or BlockEquality 
    // and more 
} 

und dann können Sie es wie folgt verwenden:

class EqualityDefinitionFactory 
{ 
    /// <summary> 
    /// Decides which class to instantiate. 
    /// </summary> 
    public static IEqualityDefinition Get(EqualityDefinitions definition) 
    { 
     switch (definition) 
     { 
      case EqualityDefinitions.BlockEquality: 
       return new BlockEqualityDefinition(); 
      default: 
       throw new NotImplementedException("Unknown type"); 
     } 
    } 
} 
Verwandte Themen