2009-06-01 14 views
1

Sagen wir, ich habe zwei Tische, Mittag-und Abendessen. Ich weiß, dass beide die DateTime-Eigenschaft "Time" enthalten.Referenz generische Eigenschaft in Ausdruck

Wenn ich eine generische Methode GetTime habe, wie kann ich db.Lunch.Time zurückgeben, wenn T Lunch ist und db.Dinner.Time, wenn T Dinner ist? Ich versuche das zu erreichen, ohne für T einzeln mit typeof, sondern generisch zu testen.

Pseudocode:

public T GetTime<T>(DateTime dt) 
{ 
    return MyDataContext.GetTable<T>().Where(entity => entity.Time == dt); 
} 

Also, wenn ich GetTime < Abendessen nennen> es wird in dem Abendtisch für alle Abendessen Einheiten mit der Eigenschaft Zeit gleich meine gelieferten Parameter dt automatisch aus.

Das Problem ist, dass ich entity.Time in meinem Ausdruck nicht angeben kann, weil T ein generischer ist. Meine Frage ist, wie man das umgehen kann, so dass ich nach jedem T suchen kann (wissend, dass alle meine Entitäten tatsächlich die Time-Eigenschaft haben), ohne spezielle Methoden für Abendessen und Mittagessen zu erstellen.

+0

implementieren hat Zeit ist eher verwirrend. Ein Codebeispiel oder ein Pseudocode würde helfen. –

+0

Einige Pseudocode hinzugefügt, und bekam eine gute Antwort :) – Alex

+0

Denken Sie daran, _generics_ sind keine _templates_. Alles, was Sie mit dem type-Parameter tun, muss nur auf der Grundlage der Einschränkungen des type-Parameters auflösbar sein. –

Antwort

5

Sie haben würden beide Klassen haben eine Schnittstelle so etwas wie dies umzusetzen:

public interface IMyInterface 
{ 
    DateTime Time{get;set;} 
} 

Und dann in der generischen Methode:

public void MyMethod<T>(T item) where T: IMyInterface 
{ 
    //here you can access item.Time 
} 
0

Sie können natürlich immer Reflexion verwenden. Wenn die beiden Typen eine gemeinsame Schnittstelle mit einer Lunch-Eigenschaft implementieren, können Sie diese auch verwenden. (Ich verstehe nicht, was Sie unter „Tabelle“ bedeutet hier.)

1

Sie könnten eine Schnittstelle verwenden, das Mittagessen und Abendessen, dass eine Eigenschaft namens

public interface IMealTime 
    { 
     DateTime Time { get; set; } 
    } 

    public class Lunch : IMealTime 
    { 
     #region IMealTime Members 

     public DateTime Time { get; set; } 

     #endregion 
    } 

    public class Dinner : IMealTime 
    { 
     #region IMealTime Members 
     public DateTime Time { get; set; } 

     #endregion 
    } 

    public class GenericMeal 
    { 
     public DateTime GetMealTime<T>(T meal) where T: IMealTime 
     { 
      return meal.Time; 
     } 
    } 
Diese Frage
+0

Große Erklärung. Kam nach der ersten Antwort in die gleiche Richtung, aber danke trotzdem. :) – Alex

+0

Ja .... Ich sah es, als ich die Antwort beendete ... kein Problem – CSharpAtl

Verwandte Themen