.net 如何访问控件';另一种形式的私有财产?

.net 如何访问控件';另一种形式的私有财产?,.net,vb.net,.net,Vb.net,我试图在另一个窗体上访问控件的属性,而不必修改另一个项目(包含我要访问的控件的项目)的代码,因为它已编译为DLL。在我试图访问的这个DLL中,函数/子过程都声明为私有。是否有任何方法可以访问控件的属性而不必修改DLL?基本上,我试图做的是为DLL创建一种控制台应用程序包装器,它将创建DLL表单的新实例,然后选中某些复选框并单击某些按钮。基本上,我正在尝试将表单自动化,因为它当前存在。您不能从任何地方访问私有属性,方法是修改(您不想这样做:()类并将这些属性转换为公共/全局范围)您不能从任何地方访

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

您不能从任何地方访问私有属性,方法是修改(您不想这样做:()类并将这些属性转换为公共/全局范围)

您不能从任何地方访问私有属性,方法是修改(您不想这样做:()类并将那些具有公共/全局范围的属性转换为Private意味着“Private”。您不能访问另一个类的私有成员

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:我是否谈到了反思,你听不到?不,你没有谈到反思,对不起,我是指另一个答案的评论。我将删除它。