2016-08-30 2 views
0
Type type_class_a = ....; 
Type type_class_b = type_class_a.GetField("name_b").FieldType; 
MethodInfo method = type_class_b.GetMethod("method"); 
method.Invoke(type_class_b,new object[] {"test_string"}); 

в дллОтражение: вызвать метод внутри статического поля

public class class_a 
{ 
    public static class_b name_b = new class_b(); 
} 
public class class_b 
{ 
    public void method(string data) 
    { 
    } 
} 

, но я получил ошибку

Необработанное исключение типа «System.Reflection.TargetException» произошло в mscorlib.dll Дополнительная информация : Объект не соответствует типу цели.

Тогда как его вызывать? Thankyou.

+2

Первый аргумент 'method.Invoke' должен быть * экземпляром * класса_b', а не типом. Вы вызываете метод экземпляра - вам все равно нужен экземпляр. – Blorgbeard

+0

Спасибо, это работает. 'var instance = Activator.CreateInstance (type_class_b); type_class_a.GetField ("name_b"). SetValue (type_class_a, instance) ' –

+0

При создании экземпляра с использованием Activator.CreateInstance (...) создается другой объект в памяти. Таким образом, если статический член 'name_b' вашего' class_a' хранится в ячейке памяти 0x1234, то объект, созданный с помощью Activator.CreateInstance, не будет этим объектом, кроме нового объекта, который может быть сохранен по адресу памяти 0x9876.Следовательно, у вас может не быть того же значения полей и свойств в этом объекте, созданных с помощью Activator.CreateInstance; а также это приведет к много времени для отладки (потому что вы не сможете определить, где теряются значения) –

ответ

1

Как ваш класс class_a определяет объект типа class_b и class_b содержит метод method, ваш подход будет выглядеть следующим образом (в DLL)

  1. Получить Type из class_a объекта в коде (магазин в class_a_type переменная типа Type)
  2. Получить FieldInfo объект class_a_type объекта для name_b объекта (хранить его в a_field_info переменной типа FieldInfo)
  3. Получить объект этого типа поля (в вашем случае, экземпляр объекта name_b) в объекте с помощью вызова функции GetValue из FieldInfo объекта (хранить его в b_object переменной типа object)
  4. Получить MethodInfo объект для метод (названный method) в приведенном выше b_object объекта путем вызова b_object.GetType().GetMethod("method") (и хранить его в b_method объект типа MethodInfo)
  5. вызова метода путем вызова функции Invoke по указанному выше b_method объекта и прохождение b_object в качестве первого параметра (объект для вызова функции) и null в качестве второго параметра (массив параметров, передаваемых функции.

Немного путаницы ??? Найдите пример ниже:

Type class_a_type = class_a_object.GetType(); 
FieldInfo a_field_info = class_a_type.GetField("name_b"); 

object b_object = a_field_info.GetValue(class_a_object); 
MethodInfo b_method = b_object.GetType().GetMethod("method"); 

b_method.Invoke(b_object, null); 

Надежда, что помогает!

0

После получения поля FieldInfo из name_b вам нужно вызвать FieldInfo.GetValue (null), чтобы получить фактическое значение (экземпляр класса_b). Вам также нужен MethodInfo метода typeof (class_b).

После того, как вы оба из них, вы можете вызвать метод info.Invoke, проходящий в экземпляре класса_b.