2017-01-05 7 views
0

Я пытаюсь звонить из другой сборки базового класса статический метод от его производного класса динамически, используя следующий код:Выполнить метод базового класса из производного класса на другую сборку динамически

Assembly executingAssembly = Assembly.GetExecutingAssembly(); 

Assembly objectAssembly = 
    Assembly.Load(executingAssembly.GetReferencedAssemblies(). 
    Where(a => a.Name == "WebDelightBLL").FirstOrDefault()); 

Type myType = objectAssembly.GetType("WebDelightBLL.Ingredient"); 

MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public | BindingFlags.Static); 

object myInstance = Activator.CreateInstance(myType); 

dgvResultsRES.DataSource = myMethod.Invoke(myInstance, null); 

кода в Библиотеки DLL следующим образом:

public class BaseClass<DerivedClass> 
{ 
    public static Type MyType() 
    { 
     return typeof(DerivedClass); 
    } 
    public static string Prefix() 
    { 
     return "Sp" + MyType().Name; 
    } 
    public static DataTable GetAll() 
    { 
     try 
     { 
      DataTable dt = GetSP(Connection.connectionString(), 
       Prefix() + "GetAll", 5); 
      return dt; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 
public class Ingredient : BaseClass<Ingredient> 
{ 
    public string SayHello() 
    { 
     return "Hello, World!"; //Just to exemplify a point 
    } 
} 

Но я всегда получаю «ссылка на объект не указывает на экземпляр объекта»

Если я пытаюсь вызвать «SayHello()», например, я получаю нет ошибка.

Возможно ли это?

Update:

Добавляя BindingFlags.FlattenHierarchy, как указано Creep он работал как шарм. Рабочий код выглядит следующим образом:

 Type myType = objectAssembly.GetType("WebDelightBLL.Ingredient"); 

     MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public 
      | BindingFlags.Static | BindingFlags.FlattenHierarchy); 

     //object myInstance = Activator.CreateInstance(myType); <-- not needed. 

     dgvResultsRES.DataSource = myMethod.Invoke(null, null); 
+0

Вы можете создать ответ на свой вопрос, и выберите это в качестве решения :) –

+0

не было бы справедливее если @Creep сделал ответ, и я выбрал его как решение? Это мой первый пост. Я бы хотел быть как можно более вежлив с Creep, сэкономил много будущих головных болей ... –

+0

Мой плохой - я не понимал, что ответ Крипа по сути является решением (с небольшими корректировками в вашем фактическом база кода). Итак, да, я предлагаю выбрать его ответ в качестве решения. –

ответ

1

Поскольку ваш метод статичен в базовом классе, он не принадлежит его дочернему элементу.
Следующий код будет работать:

Type myType = objectAssembly.GetType("WebDelightBLL.BaseClass"); 
MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public | BindingFlags.Static); 
myMethod.Invoke(null, null); 
+0

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

+1

Просто догадайтесь, но если вы работаете над дочерним классом и добавляете флаг | BindingFlags.FlattenHierarchy 'Тип myType = objectAssembly.GetType (" WebDelightBLL.Ingredient "); MethodInfo myMethod = myType.GetMethod ("GetAll", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); myMethod.Invoke (null, null); ' – Creep

+1

Блестящий! ;) FlatterHierarchy сделал это ... –

1

Вы пытаетесь вызвать статический метод, так что вы не можете указать экземпляр объекта (чтобы избавиться от «объекта не задана ссылка на экземпляр объекта» ошибка) , И так как этот метод не имеет никаких параметров, вы можете просто создать пустой массив параметров

MethodInfo myMethod = myType.GetMethod("GetAll", BindingFlags.Public | BindingFlags.Static); 
// dont need this 
//object myInstance = Activator.CreateInstance(myType); 

//dgvResultsRES.DataSource = myMethod.Invoke(myInstance, null); 
dgvResultsRES.DataSource = myMethod.Invoke(null, new object[0]); 
+0

Это не сработало. –