Передача динамического атрибута внутреннему конструктору
-
23-08-2019 - |
Вопрос
Вызов внутреннего конструктора с динамическим аргументом в 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 и сопоставить ваш результат с ним.Следовательно, адресное пространство уже выделено и находится в области видимости, которая будет использоваться при передаче его вспомогательному конструктору.