.net 如何访问控件';另一种形式的私有财产?
我试图在另一个窗体上访问控件的属性,而不必修改另一个项目(包含我要访问的控件的项目)的代码,因为它已编译为DLL。在我试图访问的这个DLL中,函数/子过程都声明为私有。是否有任何方法可以访问控件的属性而不必修改DLL?基本上,我试图做的是为DLL创建一种控制台应用程序包装器,它将创建DLL表单的新实例,然后选中某些复选框并单击某些按钮。基本上,我正在尝试将表单自动化,因为它当前存在。您不能从任何地方访问私有属性,方法是修改(您不想这样做:()类并将这些属性转换为公共/全局范围)您不能从任何地方访问私有属性,方法是修改(您不想这样做:()类并将那些具有公共/全局范围的属性转换为Private意味着“Private”。您不能访问另一个类的私有成员.net 如何访问控件';另一种形式的私有财产?,.net,vb.net,.net,Vb.net,我试图在另一个窗体上访问控件的属性,而不必修改另一个项目(包含我要访问的控件的项目)的代码,因为它已编译为DLL。在我试图访问的这个DLL中,函数/子过程都声明为私有。是否有任何方法可以访问控件的属性而不必修改DLL?基本上,我试图做的是为DLL创建一种控制台应用程序包装器,它将创建DLL表单的新实例,然后选中某些复选框并单击某些按钮。基本上,我正在尝试将表单自动化,因为它当前存在。您不能从任何地方访问私有属性,方法是修改(您不想这样做:()类并将这些属性转换为公共/全局范围)您不能从任何地方访
var foo = new Foo();
var doSomething = (Func<String, String>)
Delegate.CreateDelegate(typeof(Func<String, String>), foo, "DoSomething");
Console.WriteLine(doSomething("Hello!"));
如果不使用反射,也就是说。Private表示“Private”。您不能访问另一个类的私有成员
var foo = new Foo();
var doSomething = (Func<String, String>)
Delegate.CreateDelegate(typeof(Func<String, String>), foo, "DoSomething");
Console.WriteLine(doSomething("Hello!"));
如果不使用反射,也就是说。您可以使用Delegate.CreateDelegate调用另一个类的私有方法/属性
var foo = new Foo();
var doSomething = (Func<String, String>)
Delegate.CreateDelegate(typeof(Func<String, String>), foo, "DoSomething");
Console.WriteLine(doSomething("Hello!"));
var foo=new foo();
var doSomething=(Func)
CreateDelegate(typeof(Func),foo,“DoSomething”);
Console.WriteLine(doSomething(“Hello!”);
您可以使用Delegate.CreateDelegate调用另一个类的私有方法/属性
var foo = new Foo();
var doSomething = (Func<String, String>)
Delegate.CreateDelegate(typeof(Func<String, String>), foo, "DoSomething");
Console.WriteLine(doSomething("Hello!"));
var foo=new foo();
var doSomething=(Func)
CreateDelegate(typeof(Func),foo,“DoSomething”);
Console.WriteLine(doSomething(“Hello!”);
私有值不能从外部访问,但你可以使用反射来实现这一点,但正如其他人所说,反射会造成混乱,无论如何,请看一看并希望它能有所帮助。私有值不能从外部访问,但你可以使用反射来实现这一点,但正如其他人所说,反射会造成混乱请看一看并。希望它有帮助。如果控件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来获取特定实例的私有内容。如果控件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来获取特定实例的私有内容。我已经找到了答案,但由于某些原因,另一个表单没有更新复选框
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
我知道了,但由于某种原因,另一个表单没有更新复选框
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
事实证明,像这样做要容易得多:
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
事实证明,像这样做要容易得多:
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
这似乎几乎可以满足我的需要,但我正在尝试获取另一个FORM上复选框的“Checked”属性值。我尝试了类似的操作,但我得到的对象引用未设置为对象错误的实例:Dim xmlGenForm As New XMLGen.FormGenerator xmlGenForm.Show()Dim CheckBoxCopyToAppcluster As String=“CheckBoxCopyToAppcluster.Checked”MsgBox(xmlGenForm.[GetType]().GetField(CheckBoxCopyToAppcluster,System.Reflection.BindingFlags.NonPublic或System.Reflection.BindingFlags.Instance)。GetValue(xmlGenForm.ToString)这似乎几乎可以满足我的需要,但我正在尝试获取另一个FORM上复选框的“Checked”属性值。我尝试了类似的操作,但我得到的对象引用未设置为对象错误的实例:Dim xmlGenForm As New XMLGen.FormGenerator xmlGenForm.Show()Dim CheckBoxCopyToAppcluster As String=“CheckBoxCopyToAppcluster.Checked”MsgBox(xmlGenForm.[GetType]().GetField(CheckBoxCopyToAppcluster,System.Reflection.BindingFlags.NonPublic或System.Reflection.BindingFlags.Instance)。GetValue(xmlGenForm.ToString)即使您可以使用反射访问私有部分,您也不应该访问。您将创建一个不可维护的混乱。即使您可以使用反射访问私有部分,您也不应该访问。您将创建一个不可维护的混乱。@MarkJ:我是说反射的,对吗?不,您没有提到反射,对不起,我是说这个评论是为了其他答案。我将删除它。@MarkJ:我是否谈到了反思,你听不到?不,你没有谈到反思,对不起,我是指另一个答案的评论。我将删除它。