2016-04-28 11 views
-2

I Basisklasse Entity und eine enheritance Klasse sagen Startseite,generische Klassen und deren Kind

public class Home : Entity 
{ 
    public int CityId{get;set;} 
} 

public class Town : Entity 
{ 
    public int CityId {get;set} 
    public Home CityHall {get;set;} 
    public List<Home > Homes{get;set;} 
} 

ich die CityID für Stadt und ihre Kinder so einen ersten Versuch habe ich die folgende

festlegen möchten
public class DataAccessBase<T> where T : Entity 
{ 
    public int Add(T entity) 
    { 
     Type t = typeof(T); 
     PropertyInfo prop = t.GetProperty("CityId"); 
     if (prop != null) 
     { 
      prop.SetValue(entity, 2); 
     } 
    } 
} 

diese Arbeit nur für die Eltern wie Kinder zugreifen, ich othat allgemein einfach d wollen, weil ich einen dataaaccesslayer dass Einsatz von Datenbank haben genrically

+1

Sie können die Eigenschaften direkt einstellen keine Notwendigkeit für die Reflexion – Nkosi

+0

Nein, ich habe eine generische Klasse der Datenbank hinzufügen, so bin in der Notwendigkeit t og macht das energetisch @Nkosi – AMH

+0

Keiner deiner Klassen ist generisch? Außerdem ist CityId keine Eigenschaft vom Typ Typ ?? –

Antwort

2

Es sieht aus wie zwei unabhängige Probleme sind

  • wie Eigenschaft eines Objekts ohne Kenntnis zu setzen, wenn Eigenschaft ist: Reflexion, wie Sie es, dass zu lösen haben. Beachten Sie, dass dies nicht sehr C# -Weg ist - Sie würden einige Schnittstellen verwenden und Generics auf diese Schnittstelle beschränken, um einen stark typisierten Zugriff auf Eigenschaften zu ermöglichen.

  • wie "untergeordnete" Objekte ohne Typ zu erkennen: traditionelle Lösung ist wieder Schnittstelle für "GetChildren" -Funktionalität hinzufügen. Alternativ können Sie mit Reflektion gehen und alle Eigenschaften des Typs "Kind" finden und mit allen Eigenschaften des Typs IEnumerable<"child type"> kombinieren.

    Wenn Sie einige Konvention verwenden können dynamic einfachere Alternative zum Nachdenken sein könnte (dh jeder Typ macht Children Eigenschaft, sie aufzuzählen.

    dynamic town = GetTown(); 
    foreach(dynamic child in town.Children) {...} 
    
+2

FWIW, ich mag die Schnittstellenlösung viel mehr als 'dynamisch'. Z.B. 'Schnittstelle IHasChildren wobei T: Entität {IEnumerable GetChildren(); } 'then' Town: Entity, IHasChildren {...} '. Ich denke jedoch nicht, dass die Frage klar genug ist, um vollständig zu antworten. –

+0

@pswg in der Tat - ich würde "dynamische" nur als Alternative zur Reflexion verwenden (dh wenn der Code nicht geändert werden kann, um eine gemeinsame Schnittstelle hinzuzufügen) –

+2

Ich bin mir nicht sicher, ob Sie sich dessen bewusst sind, aber nur um klar zu sein Für andere Leser ist "dynamic" eigentlich nur syntaktischer Zucker für eine einfache alte Reflexion. Der C# -Compiler wandelt das in etwas um, das ungefähr wie folgt aussieht: '(IEnumerable) (town.GetType(). GetProperty (" Children "). GetValue (Stadt))'. –

1

Sie können die Eigenschaften direkt keine Notwendigkeit für Reflexion gesetzt

+0

diese generische Klasse ist ein cconcept ich don ', kenne den kommenden Typ oder seine Kinder – AMH

Verwandte Themen