2010-10-27 2 views
0
ControlType = "System.Windows.Forms.WindowsFormsApplication1." + "PictureBox1"; 
System.Reflection.Assembly asm; 
asm = typeof(Form).Assembly; 
ControlObject = (System.Windows.Forms.Control)asm.CreateInstance(ControlType); 
ControlObject.Name = ControlName; 

Следующий код, генерируемый за исключением следующего за мной:NullReference Exception необработанный. C# Отражение

ControlObject.Name = ControlName; 

NullReferenceException был unhandle объекта не задана ссылка на экземпляр объекта.

+0

Можете ли вы отформатировать свой код? – rkg

+0

Вы понимаете, что вы пытаетесь сделать? – SLaks

+0

Неправильная сборка. Ваш пользовательский класс PictureBox1 * не * находится в сборке system.Windows.Forms.dll. –

ответ

0

Похоже, что CreateInstance возвращает null, что означает, что тип не был найден в сборке. Является ли PictureBox1 типом или объектом?

4

Assembly.CreateInstance ожидает имя типа, и вы, кажется, передаете ему имя экземпляра типа (а именно, PictureBox с именем PictureBox1.). Поэтому ControlObject - null, и таким образом ControlObject.Name будет кидать NullReferenceException.

Непонятно, что вы пытаетесь сделать, но именно поэтому вы столкнулись с проблемой, которую вы испытываете. Если вы пытаетесь создать новый экземпляр PictureBox, я не понимаю, почему вы не просто говорите new PictureBox(); этот класс имеет открытый конструктор без параметров. С другой стороны, если вы настаиваете на отражение, можно сказать, что

controlType = PictureBox1.GetType(); 
controlObject = Activator.CreateInstance<Control>(controlType); 

Мы могли бы помочь больше, если бы мы знали, что вы пытаетесь сделать, вместо того, чтобы просто бросать код, который не работает на нас и ждет нас, чтобы решить мировой голод ,

Кроме того,

ControlType = "System.Windows.Forms.WindowsFormsApplication1." + "PictureBox1"; 
  1. Пожалуйста, переименуйте эту переменную controlType. Вы должны использовать camel case для имен переменных.

  2. Почему у вас есть ваш класс приложений WindowsFormsApplication1, проживающий в системном пространстве имен System.Windows.Forms? Не делай этого.

+0

Спасибо всем. Все в порядке. Но я подумал, что таким образом (CreateInstance) я могу получить прозрачный фон в своих png-изображениях. С PictureBox1 ничего не работает. Кто-нибудь может помочь? Мой код для прозрачной красной краски e.Graphics.DrawImage (paint, x, y); – in4man

+0

Что такое тип переменной управления? Пожалуйста, – in4man

+0

@ user432121: 'System.Type'. – jason

0

Surly ваше приложение не System.Windows.Forms пространства имен

"System.Windows.Forms.WindowsFormsApplication1." + "PictureBox1" 

Try:

ControlObject = (System.Windows.Forms.Control)asm.CreateInstance(typeof(PictureBox)); 

или просто

ControlObject = new PictureBox(); 

создать п ew экземпляр контроля.

Возможно, вы хотите найти существующий элемент управления PictureBox в своей форме?

1

Вы, вероятно, пытаетесь написать

ControlObject = new PictureBox(); 
+0

Брумль есть у меня собственный класс PictureBox1 с переопределенным элементом Paint – in4man

+1

@user: Затем вам нужно написать 'ControlObject = new PictureBox1();'. – SLaks

0

Это означает, что asm.CreateInstance(ControlType); возвращается нуль.

Таким образом, ControlType имеет неправильное значение.Предполагается получить в качестве параметра тип http://msdn.microsoft.com/en-us/library/dex1ss7c.aspx, и кажется, что вы отправляете экземпляр PictureBox1.

Должно быть ControlType = "System.Windows.Forms.PictureBox";