2010-02-25 7 views
0

Я пытаюсь получить доступ к свойствам элементов управления в другой форме без необходимости изменять код другого проекта (тот, который содержит элементы управления, к которым я хочу получить доступ), поскольку он уже скомпилирован как DLL. В этой DLL, к которой я пытаюсь получить доступ, функции/подпроцедуры объявляются как частные. Будет ли какой-либо способ доступа к свойствам элементов управления без необходимости изменять DLL? В основном то, что я пытаюсь сделать, это создать своего рода консольную оболочку приложения для DLL, которая создаст новый экземпляр формы DLL, а затем проверит определенные флажки и нажимает определенные кнопки. В принципе, я пытаюсь автоматизировать форму, как она существует в настоящее время.Как получить доступ к элементам управления в другой форме?

ответ

1

Вы не можете получить доступ к частному свойств из любой точки, способ сделать это, чтобы изменить (что вы не хотите делать :() класс и превратить эти свойства с открытыми/глобальными рамками

+0

@MarkJ : Я говорил о размышлении, не мог тебя достать? – Sarfraz

+0

Нет, вы не говорили об отражении, извините, я имел в виду этот комментарий для другого ответа. Я удалю его. – MarkJ

2

Частных средств " частный». Вы не можете получить доступ к закрытым членам другого класса.

не без использования отражения, то есть.

+0

Даже если вы можете получить доступ к частным частям с помощью отражения, вы не должны. Вы создадите непоправимый беспорядок. – MarkJ

0

Вы можете использовать Delegate.CreateDelegate назвать частные методы/свойства другого класса.

var foo = new Foo(); 
var doSomething = (Func<String, String>) 
    Delegate.CreateDelegate(typeof(Func<String, String>), foo, "DoSomething"); 
Console.WriteLine(doSomething("Hello!")); 
0

Приватные значения предназначены для доступа не из стороны, но вы можете сделать это с помощью отражения, но, как говорят другие, отражение может создать беспорядок, в любом случае взгляните на this и this. Надеюсь, поможет.

0

Если контрольная DLL построена с помощью частных аксессуаров, вероятно, именно по этой причине. Но, конечно, не все программисты разрабатывают свои классы с самого начала, и иногда могут быть ситуации, когда вам нужно получить доступ к некоторым приватным свойствам, например, в вашем случае. Если вы хотите получить доступ к частному полю, вы можете сделать это с помощью рефлексии, как упомянули другие.

Попробуйте это на поле

string theFieldName = "_member"; 
obj.GetType().GetField(
    theFieldName, 
    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance 
).GetValue(obj); 

Или это, если вы после метода

string theMethodName = "_someMethod"; 
obj.GetType().GetMethod(
    theMethodName, 
    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance 
).Invoke(obj, parameters); 

Вы должны поставить BindingFlags получить частное содержание конкретного экземпляра.

+0

Кажется, что это может почти работать для того, что мне нужно, но я пытаюсь получить значение свойства «Проверено» для флажка в другой форме. – DaRkMuCk

+0

Я пробовал что-то вроде этого, но получаю ссылку на объект, не установленную в экземпляр ошибки объекта: Dim xmlGenForm As New XMLGen.FormGenerator xmlGenForm.Show() Dim CheckBoxCopyToAppcluster As String = "CheckBoxCopyToAppcluster.Checked" MsgBox (xmlGenForm [GetType]() ПолучитьПолеЗаголовка (CheckBoxCopyToAppcluster, System.Reflection.BindingFlags...NonPublic или System.Reflection.BindingFlags.Instance) .GetValue (xmlGenForm) .ToString) – DaRkMuCk

0

Я понял это, но по какой-то причине другая форма не обновляется флажок

Dim chk As New CheckBox 
    chk.Checked = False 
    Dim xmlGenForm As New XMLGen.FormGenerator 
    xmlGenForm.Show() 
    Dim pInfo As System.Reflection.PropertyInfo 
    pInfo = xmlGenForm.GetType().GetProperty("CheckBoxCopyToAppcluster", Reflection.BindingFlags.IgnoreCase Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) 
    pInfo.SetValue(xmlGenForm, chk, Nothing) 

    If CBool(pInfo.GetValue(xmlGenForm, Nothing).CheckState) = True Then 
     MsgBox("checked") 
    Else 
     MsgBox("not checked") 
    End If 
0

Это оказалось намного проще делать это так:

Dim xmlGenForm As New FormGenerator 
xmlGenForm.Show() 
Dim xmlGenFormGroupBox2 As GroupBox = xmlGenForm.Controls("GroupBox2") 
Dim CheckBoxCopyToAppcluster As CheckBox = xmlGenFormGroupBox2.Controls("CheckBoxCopyToAppcluster") 

CheckBoxCopyToAppcluster.CheckState = CheckState.Checked 
Смежные вопросы