如何在另一个表单上访问控件的私有属性?

时间:2010-02-25 13:48:32

标签: .net vb.net

我试图在另一个表单上访问控件的属性,而不必修改其他项目的代码(包含我想要访问的控件的代码),因为它已经编译为DLL。在我试图访问的这个DLL中,函数/子过程都被声明为私有。是否有任何方法可以访问控件的属性而无需修改DLL?基本上我要做的是为DLL创建一种控制台应用程序包装器,它将创建DLL表单的新实例,然后选中某些复选框并单击某些按钮。基本上,我正在尝试自动化当前存在的表单。

7 个答案:

答案 0 :(得分:2)

私人意味着“私人”。您无法访问其他类的私人成员。

不是没有使用反射,也就是说。

答案 1 :(得分:1)

您无法从任何地方访问私有属性,执行此操作的方法是修改(您不想这样做:()类并使用公共/全局范围转换这些属性

答案 2 :(得分:0)

您可以使用Delegate.CreateDelegate调用另一个类的私有方法/属性。

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

答案 3 :(得分:0)

私人价值不是从外面访问,而是你可以使用反射来做到这一点,但正如其他人所说反射会造成混乱,反正看看thisthis。希望它有所帮助。

答案 4 :(得分: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以获取特定实例的私有内容。

答案 5 :(得分: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

答案 6 :(得分: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