我想访问另一个窗体上的控件属性,而不必修改其他项目(包含我想要访问的控件的项目)的代码,因为它已经编译为一个DLL。在我尝试访问的这个DLL中,函数/子程序都被声明为私有。是否有任何方式访问控件的属性,而无需修改DLL?基本上我想要做的是创建一个DLL的控制台应用程序包装,将创建一个DLL的窗体的新实例,然后使某些复选框选中并单击某些按钮。基本上,我试图自动化表单,因为它目前存在。如何访问控件的另一个表单上的私有属性?
回答
您不能访问从任何地方的私人性质,要做到这一点的方法是修改(你不想做:()类,把这些属性与公共/全球范围
私人手段“私人”你不能访问私有成员另一个类的。
如果不使用反射,这是。
即使您可以使用反射访问私人部件,您也不应该这样做。你会创造一个难以维系的混乱。 – MarkJ 2010-02-25 14:48:21
您可以使用Delegate.CreateDelegate调用另一个类的私有方法/属性。
var foo = new Foo();
var doSomething = (Func<String, String>)
Delegate.CreateDelegate(typeof(Func<String, String>), 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以获取特定实例的私人内容之后。
这似乎可能几乎为我需要的工作,但我想获得'检查'的属性值在另一个表单上的复选框 – DaRkMuCk 2010-02-25 14:44:25
我尝试了这样的事情,但我得到的对象引用未设置为实例的对象错误: 昏暗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
我想通了,但由于某些原因,其他形式的没有更新的复选框
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
- 1. 从另一个表单访问属性
- 2. 如何从另一个表单中更改控件属性
- 3. 访问另一个表单上的值
- 4. 家长表单类无法访问孩子的私有属性
- 5. 在另一个表单上访问/设置控件
- 6. 访问类中的私有属性
- 7. 如何从自定义类中访问另一个类/控件的属性?
- 8. 如何将控件的属性绑定到另一个控件的属性?
- 9. 访问另一个类的属性
- 10. 如何在另一个类中访问一个类的属性?
- 11. 从另一个表单访问DataModule上的一个事件
- 12. 如何访问一个属性列表
- 13. c#从另一个类访问WinForm控件属性
- 14. 如何从另一个用户控件访问form1上的label4?
- 15. 如何访问Golang中另一个包的私有函数?
- 16. 如何从Javascript中的另一个私有方法访问私有方法
- 17. 如何从文本框访问属性到另一个表格
- 18. 如何访问一个类的属性在另一类LINQ
- 19. 如何从另一个控制器(不是来自模板)访问另一个控制器的属性
- 20. 修改从另一个托管bean作为托管属性访问的托管bean的私有对象属性
- 21. 从另一个模块上下文访问属性文件
- 22. 如何访问指定属性的元素与另一个定的属性值
- 23. 在另一个属性中访问一个对象属性
- 24. 如何从另一个UIViewController访问一个UIViewControllers属性?
- 25. 如何在JavaScript的公共方法中访问私有属性?
- 26. 如何在VB.Net的类属性中访问私有常量?
- 27. 访问私有对象属性
- 28. 访问私有属性Javascript OOP
- 29. 访问受保护或私有属性
- 30. 如何访问另一个.m文件的.m文件的属性?
@MarkJ :我是否谈过反思,不能得到你? – Sarfraz 2010-02-25 14:50:15
不,你没有谈论反思,对不起,我的意思是对另一个答案的评论。我将删除它。 – MarkJ 2010-02-25 16:11:24