2016-03-21 5 views
0

私は現在、GenericのC#の中で学んで研究していますが、作成されたメソッドを実際に使って苦労しています。一般的なメソッドにアクセスすることはできません

私が試してみました:私は(C#のフォームで)行うときに

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(); 
    } 
} 

をしかし:

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

test.LINQtoDataTable()が出てくるか、存在しません。誰も助けてくれますか?私はそれが静的LINQtoDataTable metode becuse

+2

'LINQtoDataTable'は私的ネストされたクラスの静的メソッドなので、' test.LINQtoDataTable'は動作しません。 – rbm

+2

あなたは静的なクラスとしても必要です(データパラメータはこれに設定する必要があります)、拡張メソッドを少し調べることができます:) – Icepickle

答えて

3

extension-methodは静的パブリッククラスに存在しますが、現在のコードはプライベートクラス内に静的メソッドしかありません。だから、あなたはこの必要があります。

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

をさらにあなたがその拡張子-方法になりたいのparamにthis -keywordがバインドする必要があります。

最後に、拡張メソッドはネストされたクラスにとどまることはできません。ネストされたクラスは、あなたが本当に必要としないクラスです。ネストされたクラスを削除し、(またnaming-conventions for classesと考えてください)publcとstaticメソッドをそこに置きます。したがって、このクラスのインスタンスは必要ありません。 SimpyコールmyEnumerable.LINQtoDataTable()

+0

私はできないようです/ – KDOT

+1

@ KyleE4Kいいえこれを "Extension"クラスに抽出する必要はありません。これは、オブジェクトを開始するために使用するクラスであれば、サンプルクラスに含める必要はありません。重要な部分は、拡張メソッドが定義されているクラスが静的で、メソッドの最初のパラメータにthisキーワードが含まれているということです( – Icepickle

+0

)良い点@HimBromBeere、ありがとう –

2

が大幅に事前に&感謝を感謝:(私は方法をpublic'd、それが内部にあるクラスをインスタンス化するので、これは表示されない理由に混乱しています、ではありませんexampleインスタンスを必要としています。あなたが拡張メソッドを作成しようとしている、と拡張メソッドのためにいくつかの前提条件は、それは、持っている方法のためにそこにあるex properyのどのlocat、その名前を介してアクセス。

myTestClass.example.LINQtoDataTable(...) 
3

静的でなければならず、静的なクラスでは、行方不明再thisキーワードであり、あなたのクラスは、それの開始で静的ではありません。

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; 
} 

、あなたはそれを呼び出すようにしようとしている間、あなたはIEnumerable<T>ための拡張メソッドを作成しているので、あなたはまだ、今、インテリセンスでそれを見ることができますただT

それを呼び出すことができるために

、あなたがList<T>を作成する必要があります。私は一度拡張メソッドのトピックに関するブログ記事を書いた

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

、あなたは簡単な例here

で拡張メソッドについて読むことをお勧めします
+0

私はメソッドにこれらの変更を加えました – KDOT

関連する問題