2015-03-09 5 views
0
void A(object o) 
{ 
    ... 
    Assembly a = Assembly.LoadFile(...); 
    Type t = a.GetType(@"namespace.className"); 
    MethodInfo mi = t.GetMethod(@"MethodName"); 
    mi.Invoke(instace, new Object[] {o}); 
    ....   
} 

метод мне нужно вызвать принять другой тип, мне нужно, чтобы привести объект к этому типу, но, тип известен только во время выполнения, поэтому я могу конвертировать/лить объект другому типу, известному только во время выполнения? Я могу изменить только метод А.Cast объект другого типа во время выполнения

спасибо.

+0

Вы пытаетесь вызвать конкретную перегрузку 'MethodName'? Это единственная причина, по которой я могу думать о необходимости типа аргумента. –

ответ

1

Отражающие API используют только ссылки object. Задание ссылки - это операция по этой ссылке. Это никак не влияет на объект.

По этой причине здесь ничего не нужно делать. Просто перейдите o в Invoke, как вы уже делаете. API Reflection проверяет тип o и передает его методу, который вы хотите вызвать.

1

MethodInfo.Invoke(object instance, object[] arguments) является динамическим вызовом. Это означает, что литье производится автоматически. Если выбрано InvalidCastException, то вы передаете неправильный аргумент или исключение выбрасывается из внутреннего кода и не вызвано переданным аргументом объекту.

0

Это код, который я использовал, когда у меня появилось несколько похожих сообщений, требующих различной обработки. Ordertype был экземпляром типа пользовательского объекта заказа.

  var _ot = Activator.CreateInstance(ordertype); 
      var _otconvert = ordertype.GetMethod("ConvertRequestPayload"); 

      object[] _params = new object[] {message}; 

      var objectf = _otconvert.Invoke(_ot, _params); 

      var _as = Activator.CreateInstance(servicetype); 
      var _method = servicetype.GetMethod("StartProcess"); 

      var rMessage = _method.Invoke(_as, new object[] {objectf}); 

В принципе, активатор - это то, что вам нужно. он позволяет создавать объекты требуемого типа во время выполнения.

+0

Я не хочу создавать другой экземпляр ... Я хочу использовать экземпляр {This}. –

+0

Я не думаю, что то, что вы пытаетесь выполнить, возможно с использованием экземпляра, который у вас уже есть, особенно если вы хотите его преобразовать или преобразовать. Если я ошибаюсь, я узнаю что-то новое. – KonB

0

Я изменил {object 0} на {dynamic 0}, и это сработало.

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