2017-07-21 5 views
0

Ich bin eine Liste aus einer Tabelle in der Datenbank abrufen:C# generische Liste als Funktionsparameter

var dependency = (from ctf in dc.Fields 
        join ctfd in dc.FieldsDependencies on ctf.id equals ctfd.Fieldid_depend 
        where ctf.ctid == ctid && ctf.fieldname == fieldname 
        select ctfd).ToList(); 

ich diese Liste als Parameter in einer anderen Funktion bin vorbei:

public void DoYesDeleteDepField<T>(string fieldname, List<T> dep) 

Wie kann ich ändere es, damit ich das ID-Feld abrufen kann?

Aber ich kann nicht durch die Liste iterieren und das depsingle.id Feld erhalten.

foreach (var depsingle in dep) 
     { var depsingleid = depsingle.id //ERROR 
..... 
+2

Warum ist die Funktion generisch? Aus diesem Grund können Sie nicht auf bestimmte Typfelder zugreifen. T ist generisch und Sie versuchen, auf ein bestimmtes Feld in einem bestimmten Typ zuzugreifen. – user3185569

+0

Meinst du 'var desingleid = depsingle.id'? – MotKohn

+1

Nun, 'T' weiß nichts über eine 'ID' oder so, deshalb erhalten Sie einen Fehler. Sie müssten Ihrem Typ eine generische Integritätsregel hinzufügen, um nur Typen zuzulassen, die von Ihrer Basisklasse erben oder Ihre Schnittstelle implementieren. Oder lassen Sie Generika einfach weg, wenn Sie nur an einem einzigen Typ interessiert sind. – HimBromBeere

Antwort

0

Sie müssen definieren, was T .. public void ... where T: IHasId Oder es auf Klassenebene definieren

+0

Programmieranleitung für C#: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters –

0

Er weiß nicht, dass die <T> die Parameter haben .id so entweder werfen Sie es (wie dieses var a = (int)something or var a = something as int), oder schreiben Sie es auf etwas weniger allgemeines vom List<t>. z.B. List<classname>.

0

Als T kann etwas von int zu MyClass wurde leider sein kein Mitglied id auf all diesen Typen genannt. So müssen Sie eine generische Einschränkung, die den Compiler sagt, welche Arten möglich sind, für T, z:

public void DoYesDeleteDepField<T>(string fieldname, List<T> dep) where T: MyClass 

oder Generika auslassen vollständig als nur eine Art möglich ist, den Begriff generic ziemlich nutzlos. Definieren Sie einfach eine Klasse, die die Werte von Ihrem verbinden und übergeben diese an Ihre Methode hilds:

class MyClass 
{ 
    public string Id { get; set; } 
    // further properties 
} 

Jetzt Instanzen dieser Objekte aus der Abfrage erstellen:

var result = (from ctf in dc.Fields 
       join ctfd in dc.FieldsDependencies on ctf.id equals ctfd.Fieldid_depend 
       where ctf.ctid == ctid && ctf.fieldname == fieldname 
       select new MyClass 
       { 
        id = ctf.id, 
        // further properties 
       }).ToList(); 

public void DoYesDeleteDepField(string fieldname, List<MyClass> dep)