以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  [原创]DotNet中如何将属性作为参数引用传递  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=17301)


--  作者:supnate
--  发布时间:4/21/2005 10:45:00 PM

--  [原创]DotNet中如何将属性作为参数引用传递
花了不少时间研究这个问题,网上也没搜到合适的答案,现在终于发现了解决办法,写出来和大家共享,嘿嘿

问题来由:在一个程序中需要集中处理一些控件的属性,如TextBox的Text属性,Label的Text属性,Button的Value属性等等,于是我用一个函数来处理,如PropertyHandler(string property)
但是这样的代码:
public void PropertyHandler(string property)
{
property="Setted";
}
public static main()
{
TextBox tb=new TextBox();
tb.Text="a";
PropertyHandler(tb.Text);
Consle.WriteLine(tb.Text);
}

会发现打印出来的仍然是"a"
原因很简单,.net中所有的字符串都是恒定不变的,尽管string是一个object,但由于字符串驻留技术,表现出来的仍然是值传递形式,对于string属性,传递过去的是get出来的值,而不是属性引用本身。此时如果是一个string字段(注意不是属性),可以通过ref out关键字来实现引用传递,可是对于属性却是不行的,SDK中特别提起ref out对属性无效,毕竟属性实际上是属于方法的行列。

解决办法:为了实现属性的引用传递不得不借助于其它的手段,可能代码看上去没那么好看,但能用就行,呵呵,现贴出来大家评评吧

public void PropertyHandler(object _obj,string _propertyName)
{
System.Reflection.PropertyInfo pi=_obj.GetType().GetProperty(_propertyName);
pi.SetValue(_obj,"value",null);
pi.GetValue(_obj,null);
}

这样等于是把对象和属性名作为参数传过去,然后通过反射得到实际的属性引用,通过调用GetValue和SetValue方法实现了属性的get和set操作,代码可能容错性不是很好,毕竟有的属性是只读或只写的,那么SetValue和GetValue可能就无法执行,但主要是提供一个思想,希望大家遇到这类需求的时候能知道有这样一个方法,呵呵



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
5,867.188ms