2010-02-25 25 views
0

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

回答

1

您不能访问从任何地方的私人性质,要做到这一点的方法是修改(你不想做:()类,把这些属性与公共/全球范围

+0

@MarkJ :我是否谈过反思,不能得到你? – Sarfraz 2010-02-25 14:50:15

+0

不,你没有谈论反思,对不起,我的意思是对另一个答案的评论。我将删除它。 – MarkJ 2010-02-25 16:11:24

2

私人手段“私人”你不能访问私有成员另一个类的。

如果不使用反射,这是。

+0

即使您可以使用反射访问私人部件,您也不应该这样做。你会创造一个难以维系的混乱。 – MarkJ 2010-02-25 14:48:21

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

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

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 2010-02-25 14:44:25

+0

我尝试了这样的事情,但我得到的对象引用未设置为实例的对象错误: 昏暗xmlGenForm作为新XMLGen.FormGenerator xmlGenForm.Show() 昏暗CheckBoxCopyToAppcluster作为字符串= “CheckBoxCopyToAppcluster.Checked” MSGBOX(xmlGenForm [的GetType]()getfield命令(CheckBoxCopyToAppcluster,System.Reflection.BindingFlags。NonPublic或System.Reflection.BindingFlags.Instance).GetValue(xmlGenForm).ToString) – DaRkMuCk 2010-02-25 14:47:58

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 
相关问题