Передача динамического атрибута внутреннему конструктору

StackOverflow https://stackoverflow.com/questions/1087389

Вопрос

Вызов внутреннего конструктора с динамическим аргументом в C # 4.0b приводит к следующему исключению

Система.Исключение ArgumentNullException:Значение не может быть нулевым.Имя параметра:конструктор

Пример кода (благодаря Джону Скиту)

public class Test
{
    internal Test(string x)
    {
    }

    static void Main()
    {
        dynamic d = "";
        new Test(d);
    }
}

Похоже, что среда выполнения не учитывает внутренние конструкторы, когда пытается выбрать правильный.Похоже, это ошибка, поэтому я опубликовал ее на Connect:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx ?Идентификатор обратной связи=472924

Похоже, они исправили это для новой версии.

Это было полезно?

Решение

Редактировать:Хорошо, теперь я проследил за этим намного дальше - это использование внутреннего конструктора, который вызывает проблему.

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

public class Test
{
    internal Test(string x)
    {
    }

    static void Main()
    {
        dynamic d = "";
        new Test(d);
    }
}

Я предлагаю вам зарегистрировать это с помощью Контакты - тогда разместите URL здесь, и мы сможем проголосовать за него :)

(Я предполагаю, что внутри DLR есть вызов getConstructor без соответствующих BindingFlags.Непубличный, но это всего лишь предположение ...)

Другие советы

Не видя кода, я бы предположил, что вы передаете не созданный экземпляр класса своему конструктору.Убедитесь, что они находятся в пределах области видимости и были созданы, напримериспользуя new, прежде чем они будут переданы вашему нединамическому объекту.

Редактировать

Увидев ваш код, я бы посоветовал вам использовать DynamicObject, а не dynamic для вашего вспомогательного коструктора и свойства Entity.

Отредактируйте, увидев ответ Джона

Я думаю, что проблема заключается в использовании метода GetEntity() для создания экземпляра динамического объекта.

Я отмечаю, что Джон создает экземпляр MyDynamicObject в той же области, в которой он его использует.

Я предполагаю, что вы создаете экземпляр вашего объекта в методе GetEntity(), и в этом случае он больше не находится в поле зрения, когда вы начинаете его использовать, классифицируясь как локальный объект.

Использование "MyDynamicObject e = entity;" вынудит компилятор автоматически использовать конструктор MyDynamicObject и сопоставить ваш результат с ним.Следовательно, адресное пространство уже выделено и находится в области видимости, которая будет использоваться при передаче его вспомогательному конструктору.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top