Type.InvokeMember(..) в CoreCLR

Я пытаюсь динамически вызвать член определенного типа с помощью CoreCLR, но метод Type.InvokeMember недоступен при компиляции с DNXCORE50. Однако, если я компилирую с DNX451, все работает нормально.

Ниже приведен пример того, как этого можно добиться с помощью DNX451, но как сделать то же самое с DNXCORE50?

using System;
using System.Reflection;

namespace InvokeMember
{
    public class Program
    {
        public void Main(string[] args)
        {
            typeof (Program).InvokeMember("DoStuff", BindingFlags.InvokeMethod, null, new Program(), null);
        }

        public void DoStuff()
        {
            Console.WriteLine("Doing stuff");
        }
    }

}

person henningst    schedule 18.11.2015    source источник


Ответы (2)


С этим кодом работает:

        MethodInfo method = typeof(Program).GetTypeInfo().GetDeclaredMethod("DoStuff");
        method.Invoke(new Program(), null);
person aguetat    schedule 18.11.2015
comment
Исходный код тоже должен работать, если он вставит GetTypeInfo(). - person Ben Voigt; 18.11.2015
comment
@BenVoigt: GetTypeInfo().InvokeMember не работает. «TypeInfo» не содержит определения для «InvokeMember», и не удалось найти метод расширения «InvokeMember», принимающий первый аргумент типа «TypeInfo» (вам не хватает директивы using или ссылки на сборку?) InvokeMember.DNX Core 5.0 - person henningst; 18.11.2015

Для тех, кто, возможно, использовал Type.InvokeMember() с BindingFlags.SetProperty для установки свойства объекта (вместо BindingFlags.InvokeMethod), вы можете использовать этот синтаксис, который немного изменен по сравнению с ответом, данным @aguetat:

PropertyInfo property = typeof(Program).GetTypeInfo().GetDeclaredProperty("MyProperty");
property.SetValue(new Program(), newValue);
person Gyromite    schedule 07.12.2016