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