2016-03-21 7 views
0

Ich habe derzeit Generics in C gelernt und erforscht, aber ich habe Probleme damit, die einmal erstellte Methode zu verwenden.Generische Methode kann nicht zugegriffen werden

Ich habe versucht:

public class myTestClass 
{ 
    class example 
    { 
     public static DataTable LINQtoDataTable<T>(IEnumerable<T> data) 
     { 
      DataTable dt = new DataTable(); 
      PropertyInfo[] objectProps = null; // Reflection 

      if (data == null) return null; 
      foreach (T record in data) 
      { 
       if (objectProps == null) objectProps = ((Type)data.GetType()).GetProperties(); 
       foreach (PropertyInfo pi in objectProps) 
       { 
        Type collumnType = pi.PropertyType; 
        if ((collumnType.IsGenericType) && (collumnType.GetGenericTypeDefinition() == typeof(Nullable<>))) collumnType = collumnType.GetGenericArguments()[0]; 
        dt.Columns.Add(new DataColumn(pi.Name, collumnType)); 
       } 
      } 
      return dt; 
     } 

    } 

    example ex { get; set; } 

    public myTestClass() 
    { 
     this.ex = new example(); 
    } 
} 

Aber wenn ich (in C# Form) tun:

// Namespace area 
myTestClass test; 
// Main Method 
test = new myTestClass(); 

test.LINQtoDataTable() nicht kommen oder existiert. Kann mir bitte jemand helfen? Ich bin verwirrt, warum wird dies nicht angezeigt, da ich die Methode public'd und instanziert die Klasse es im Inneren ist :(

schätzten & Dank im Voraus.

+2

'LINQtoDataTable' ist eine statische Methode in einer privaten geschachtelten Klasse, so dass' test.LINQtoDataTable' nicht funktioniert. – rbm

+2

Sie brauchen es auch als eine statische Klasse (wo der Datenparameter auf diese gesetzt werden muss), können Sie Erweiterungsmethoden ein bisschen erforschen :) – Icepickle

Antwort

3

Ein extension-method existiert in einer statischen öffentlichen Klasse, während Ihr aktueller Code nur eine statische Methode innerhalb einer privaten Klasse hat. Sie müssen also diese:

public static class MyTestClass { 
    public static DataTable LINQtoDataTable<T>(this IEnumerable<T> data) { ... } 
} 

Außerdem müssen Sie die this -keyword auf dem param Sie, dass Dehn-Methode gebunden sein wollen.

Zuletzt kann eine Extension-Methode nicht in einer verschachtelten Klasse bleiben, die Sie scheinbar gar nicht brauchen. Lösche die verschachtelte Klasse und mache MyTestClass (bedenke auch die naming-conventions for classes) publc und statisch und setze die Methode dort. Sie brauchen also keine Instanz dieser Klasse. Simpy Anruf myEnumerable.LINQtoDataTable().

+0

Ich scheine nicht in der Lage zu sein Erstellen Sie jetzt eine Instanz für eine statische Klasse:/ – KDOT

+1

@ KyleE4K Nein, Sie sollten dies in eine "Extension" -Klasse extrahieren, es muss nicht in Ihrer Beispielklasse enthalten sein, wenn Sie diese zum Initiieren des Objekts verwenden möchten .Der wichtige Teil wäre, dass die Klasse, in der die Erweiterungsmethode definiert ist, statisch ist und dass der erste Parameter Ihrer Methode das Schlüsselwort this enthält (falls Sie Erweiterungsmethoden wollen) – Icepickle

+0

good point @HimBromBeere, geschätzt –

2

becuse der LINQtoDataTable metode statisch es ist nicht brauchen eine example Instanz. die locat im ex propery, und ist über seinen Namen.

myTestClass.example.LINQtoDataTable(...) 
3

Sie versuchen Erweiterungsmethode und für Erweiterungsmethode gibt es einige Voraussetzungen für das Verfahren zu haben, um es zu schaffen sollte statisch und in einer statischen Klasse sein, die eine Sie re fehlt, ist this Schlüsselwort und Ihre Klasse ist nicht statische in Start es:

public static DataTable LINQtoDataTable<T>(this IEnumerable<T> data) 
{ 
    DataTable dt = new DataTable(); 
    PropertyInfo[] objectProps = null; // Reflection 

    if (data == null) return null; 
    foreach (T record in data) 
    { 
     if (objectProps == null) objectProps = ((Type)data.GetType()).GetProperties(); 
     foreach (PropertyInfo pi in objectProps) 
     { 
      Type collumnType = pi.PropertyType; 
      if ((collumnType.IsGenericType) && (collumnType.GetGenericTypeDefinition() == typeof(Nullable<>))) collumnType = collumnType.GetGenericArguments()[0]; 
       dt.Columns.Add(new DataColumn(pi.Name, collumnType)); 
     } 
    } 
    return dt; 
} 

und Sie werden noch heute in intellisense sehen, da Sie Erweiterungsmethode für IEnumerable<T> schaffen, während Sie versuchen, es zu nennen auf nur T.

Für Lage, es zu nennen, müssen Sie eine erstellen List<T>:

List<myTestClass> listTestClass = new List<myTestClass>(); 
listTestClass.Add(new myTestClass()); 
listTestClass.LINQtoDataTable(); 

ich einmal einen Blog-Post über Erweiterungsmethoden Thema geschrieben, möchten Sie vielleicht über Extension-Methode mit einem einfachen Beispiel here

lesen
+0

Ich schätzte, machte ich diese Änderungen an der Methode – KDOT

Verwandte Themen