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

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)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java反射是指在程序运行的时候,通过特定的API来检查或修改程序的状态、能力和内部属性等,而这些在正常情况下是无法通过编译时检查来完成的。例如,通过反射机制,我们可以获取一个对象型信息并调用其方法、访问它的属性,以及创建一个对象等。 反射获取对象属性,首先需要通过Class的forName()方法来获取对象Class实例。然后通过Class的getDeclaredField()方法获取对象属性的Field对象,再通过Field对象的get()方法来获取属性。如果需要获取私有属性,则需要通过setAccessible(true)方法来取消Java语言的访问检查机制,以允许获取私有属性。 例如,假设有一个Person,其中包含有一个private String name属性,现在需要获取该属性,可以使用反射机制进行如下操作: ``` Class<?> clazz = Person.class; Object obj = clazz.newInstance(); Field field = clazz.getDeclaredField("name"); field.setAccessible(true); String nameValue = (String) field.get(obj); ``` 通过以上代码,我们可以获取Person对象的name属性,并将其赋给nameValue变量中。 需要注意的是,反射机制虽然功能强大,但由于它会在运行时改变程序的状态和能力,因此会带来诸多安全性和性能上的问题,尤其是容易引起型转换异常和内存泄漏等问题,因此在使用反射机制时要谨慎操作,避免不必要的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值