Type.InvokeMember и ссылочные типы - PullRequest
2 голосов
/ 19 июля 2010

Я пытаюсь использовать Type.InvokeMember (String, BindingFlags, Binder, Object, array []) ​​с привязкой по умолчанию.

один из аргументов целевого метода в массиве объектов является ссылочным типом, для которого установлено значение null. Я хочу, чтобы вызываемый метод создавал экземпляр ссылочного типа, чтобы я мог продолжать его использовать. Например:

using System;

namespace ConsoleApplication6
{
    class A
    {
        public void GetReferenceType(object o)
        {
            o = new object();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            object o = null;
            A a = new A();
            Type t = typeof(A);
            t.InvokeMember("GetReferenceType", System.Reflection.BindingFlags.InvokeMethod, null, a, new object[] { o });

            if (o == null)
            {
                throw new NullReferenceException();
            }
            else
            {
                //do something with o;
            }
        }
    }
}

Обходной путь должен дать A Свойство и получить доступ к o через него.

Есть ли другой способ сделать это без изменения A?

1 Ответ

7 голосов
/ 19 июля 2010

Хорошо, вам нужно внести два изменения:

  • Сделайте ваш GetReferenceType параметр ref:

    public void GetReferenceType(ref object o)
    

    У вас есть , чтобы сделать это, потому что в настоящее время ваш метод недоступен для внешнего мира. Вы должны прочитать мою статью об обработке параметров в C # .

  • Использовать значение в массиве после InvokeMember вместо исходной ссылки:

    A a = new A();
    Type t = typeof(A);
    object[] args = new object[] { null };
    t.InvokeMember("GetReferenceType", BindingFlags.InvokeMethod,
                   null, a, args);
    object o = args[0];
    

Когда вы создаете массив, например с new object[] { o }, который просто копирует значение из o в массив - он не связывает этот элемент массива с переменной o.

Лучшим решением было бы сделать GetReferenceType возвращающим новое значение, однако ... редко бывает полезно использовать параметр out или ref в методе void .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...