您的位置:首页 > 其它

通过反射技术获得实例对象的属性值

2011-06-21 15:05 281 查看
c#2.0开始支持c++里常用的泛型技术,比如泛型的容器,模板函数等,但是c#对于泛型的支持还是很有限,比如不支持模板的特化、偏特化等,并且c#里的泛型也不是真正如c++里那样的泛型,而是把模板参数转型成所有类型的根object来实现的,从这个意义上说,只是一种伪泛型,不是真实的泛型,不过它的泛型底层实现与c++不同,c++在编译的时候对于每一个模板实例都会产生一份代码,大量使用模板的结果就是代码体积膨胀。废话少说,看看c#里怎么写一个模板函数。
class Foo
{
public void Fun<T>(T v)
{
Console.WriteLine(v.ToString());
}
}

怎么读取模板参数里的一个属性值呢?比如下面一个类
class Foo
{
string _name = string.Empty;
int _age = 0;

public string Name
{
get { return _name; }
set { _name = value; }
}
public int Age
{
get { return _age; }
set { _age = value; }
}
}

class Test
{
static void Main(string[] args)
{
Foo foo = new Foo();
foo.Name = "张三";
foo.Age = 83;

Test t = new Test();
//foo的Age属性值
//打印出来的结果将是
//Age:83
t.Fun<Foo>(foo, "Age");
}

public void Fun<T>(T v, string property)
{
Type objType = v.GetType();

try
{
PropertyInfo p = objType.GetProperty(property);
object obj = p.GetValue(v, null);
Console.WriteLine("{0}:{1}", property, obj.ToString());
}
catch (Exception e)
{
Console.WriteLine("Exception : " + e.ToString());
}
}
}

这里应用到的就是所谓反射技术(Reflection)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: