如何通过一个对象的字符串描述返回该对象的实例?

torble 2004-06-29 01:24:14
我在 Form 上放了一个 button,命名 button1;

我想在运行期实现:

object m_object = ???("button1")
System.Reflection.PropertyInfo m_pi = object.GetType().GetProperty("Text");
m_pi.SetValue(m_object, "button2", null);

到达设置 button1.Text 的功能,其中 ??? 就是如何通过一个对象描述返回对象实例的实现方法。
...全文
235 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
torble 2004-07-14
  • 打赏
  • 举报
回复
谢谢大家,结贴了,不过没有理想的实现方法。
wang51346 2004-07-09
  • 打赏
  • 举报
回复
using System;
using System.Collections;
using System.Windows.Forms;

public class HashtableTest
{
public static void Main()
{
Button b1= new Button();
Button b2= new Button();
ListBox lb3 = new ListBox();

Hashtable myHT = new Hashtable();
myHT.Add("First", b1);
myHT.Add("Second", b2);
myHT.Add("Third", lb3);
string s = "First";
Console.WriteLine(myHT[s]);
Console.WriteLine(myHT["Second"]);
Console.WriteLine(myHT["Third"]);
foreach(object v in myHT.Values)
Console.WriteLine(v);
}
}
torble 2004-07-07
  • 打赏
  • 举报
回复
UP
torble 2004-07-06
  • 打赏
  • 举报
回复
提一下
torble 2004-07-04
  • 打赏
  • 举报
回复
没有直接的方法了吗?
aquahalo 2004-07-03
  • 打赏
  • 举报
回复
我想IDesignerSerializationManager也不一定能满足你和要求。因为GetInstance()方法能得到的实例是通过CreateInstance()加进来的。实现这个功能。就要先把你的对象加到序列里。
torble 2004-07-01
  • 打赏
  • 举报
回复
提一下
torble 2004-07-01
  • 打赏
  • 举报
回复

楼上的方法首先需要 FindControl,这样就只能操作 Control 的派生类了,但是其他对象就不能用这个方法了。有时我也要设置其他对象的属性。

我需要一种通过字符串返回任意对象的实例的方法。

IDesignerSerializationManager 接口有个 GetInstance 方法可以达到我的要求,但是怎样弄呢?
torble 2004-06-30
  • 打赏
  • 举报
回复
楼上的错了
aquahalo 2004-06-30
  • 打赏
  • 举报
回复
啊。我的程序写错了返回值不应该是空的。
private Control FindControl(Control control)
{
foreach(Control ctl in control.Controls)
{
if(ctl.Controls.count>1)
{
return FindControl(ctl);
}
else
{
if(ctl.Name = "test")
{
return ctl ;
}
}
}
}
eTopFancy 2004-06-30
  • 打赏
  • 举报
回复
楼上的方法可行
aquahalo 2004-06-30
  • 打赏
  • 举报
回复
如果是我的话。也用Samen168(Samen)的方法。不过改进了一下:
private void FindControl(Control control)
{
foreach(Control ctl in control.Controls)
{
if(ctl.Controls.count>1)
{
FindControl(ctl);
}
else
{
if(ctl.Name = "test")
{
return ctl ;
}
}
}
}
Samen168 2004-06-30
  • 打赏
  • 举报
回复
zjsen(星愿)(个人观点,仅供参考.请自行验证)
还是错了!

不过还是要谢谢你的关心,楼主可能有??
八爪鱼-杭州 2004-06-30
  • 打赏
  • 举报
回复
((Button)this.Controls["Button1"]).Text="abcd";
------------------
反射是用来读取并解析程序集的元数据的,不是用来引用类的实例的
八爪鱼-杭州 2004-06-29
  • 打赏
  • 举报
回复
Form.Controls属性
具体的语句如下
this.Controls["Button1"].Text="abcd";
torble 2004-06-29
  • 打赏
  • 举报
回复
提一下
torble 2004-06-29
  • 打赏
  • 举报
回复
谢谢各位的提示,但是问题还是没有解决。

首先 button1 的实例已经被建立,我不想通过 Activator.CreateInstance 再次建立了,而且在运行期我只想通过字符串的形式如 "button1" 来改变 button1 的属性,这样类型就是未知的了,也不能通过 Activator.CreateInstance 来建立。

我注意到设计期有个 IDesignerSerializationManager 接口,它有个 GetInstance 方法可以实现我的要求,但是在运行时刻不知如何去实现同样的功能...
brightheroes 2004-06-29
  • 打赏
  • 举报
回复
楼主参考Activator.CreateInstance方法
marvelstack 2004-06-29
  • 打赏
  • 举报
回复
Activator 类
ms-help://MS.NETFrameworkSDKv1.1.CHS/cpref/html/frlrfSystemActivatorClassTopic.htm

反射:
http://www.c-sharpcenter.com/CSNET/dynamicinvoke.asp
http://www.c-sharpcorner.com/Code/2002/April/LoadingAssemblyInfo.asp
Samen168 2004-06-29
  • 打赏
  • 举报
回复
foreach(Control ctl in this.Controls)
{
if(ctl.Name = "test")
{
object m_object = ctl ;
}
}

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧