2016-03-21 6 views
0

В настоящее время я изучаю и изучаю встроенный C# Generic, но я борюсь с фактическим использованием метода после его создания.Доступ к общему методу недоступен

Я пробовал:

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

Но когда я (В # Форме C):

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

test.LINQtoDataTable() не придумать или существуют. Кто-нибудь может помочь мне? Я запутался, почему это не будет появляться, так как я public'd метод и инстанс класса он находится внутри :(

высоко оценили & спасибо заранее.

+2

'LINQtoDataTable' является статическим методом внутри частного вложенного класса, поэтому' test.LINQtoDataTable' не будет работать. – rbm

+2

Вам нужен он как статический класс (где параметр данных должен быть установлен), вы можете исследовать методы расширения бит :) – Icepickle

ответ

3

extension-method существует в статическом открытом классе, в то время как ваш текущий код имеет только статический метод в частном классе. Так что вам нужно это:

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

Кроме того, вы нуждаетесь в this -ключевом слове на пары вы хотите быть, что разгибания методы будут привязаны.

Последний метод расширения не может оставаться в вложенном классе, который вам, по-видимому, действительно не нужен вообще. Удалите вложенный класс и сделайте MyTestClass (также рассмотрите naming-conventions for classes) publc и static и поместите туда метод. Таким образом, вам не нужен какой-либо экземпляр этого класса. Симпрый звонок myEnumerable.LINQtoDataTable().

+0

Кажется, я не могу теперь создайте экземпляр для статического класса:/ – KDOT

+1

@ KyleE4K Нет, вы должны извлечь его в класс «Расширение», его не нужно включать в класс примера, если это тот, который вы хотите использовать для инициирования объекта ,Важной частью будет то, что класс, в котором определяется метод расширения, является статическим и что первый параметр вашего метода содержит это ключевое слово (в случае, если вы хотите методы расширения) – Icepickle

+0

хорошая точка @HimBromBeere, оцененная –

2

becuse в LINQtoDataTable metode он статичен, не является нужно example экземпляра. который наха в ex Собствености и доступен через его имя.

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

и вы до сих пор в настоящее время увидеть его в IntelliSense, потому что вы создаете метод расширения для IEnumerable<T> в то время как вы пытаетесь вызвать его только T.

Для смог назвать его, вы должны создать List<T>:

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

я когда-то писал в блоге о методах расширения темы, вы можете прочитать о методе расширения с помощью простого примера here

+0

Оцените, я внесла эти изменения в метод – KDOT

Смежные вопросы