首页 新闻 赞助 找找看

用反射之类的技术能否获得字符串形式表示的对象实例?

0
悬赏园豆:100 [已解决问题] 解决于 2012-10-15 10:19

没有接触过反射的操作,看了不少文章,但发现似乎反射只能获取到类型,而不能获取到对象实例。

比如字符串  "mynamespace.mycalss",可以获得 自定义类mynamespace.mycalss的类型定义,从而用获取的类型生成一个该类型的对象实例。

但我希望通过字符串能够获得跟字符串同名的对象实例?比如字符串“product.id”,我希望获取到上下文里的一个product对象的id属性,不知能否实现?

卓酷的主页 卓酷 | 初学一级 | 园豆:65
提问于:2012-09-15 19:41
< >
分享
最佳答案
0

楼主是要获取上下文中已经存在的对象实例,通过对象的类型名,而不是创建新的对象实例,这显然是做不到的,反射是必须指定具体对象或类型来反射的,你那种需求只能通过在创建对象时就将其缓存的方式来后期查找。

收获园豆:50
秦楼东 | 小虾三级 |园豆:913 | 2012-09-16 10:59
其他回答(5)
0

Activator.CreateInstance(System.Type.GetType("mynamespace.mycalss"))

第二个要有product对象引用才能取属性值。

收获园豆:10
向往-SONG | 园豆:4853 (老鸟四级) | 2012-09-15 20:59
0
using System;
using System.Reflection;

namespace demo
{
    class Product
    {
        public Int32 Id { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //Assembly assembly = Assembly.Load(".....");
            //Type type = assembly.GetType("demo.Product");
            //我写在一个文件里面了,就用不到上述方式来获取type了
            Type type =typeof(Product);
            Object product = Activator.CreateInstance(type);
            PropertyInfo pid = type.GetProperty("Id");
            pid.SetValue(product, 123, null);
            Console.WriteLine(pid.GetValue(product, null));
        }
    }
}
收获园豆:10
Timetombs | 园豆:3954 (老鸟四级) | 2012-09-16 02:03
0

你最好说下你的应用场景,怎么会出现如此奇怪的需求

动态模版语言也许可以解决问题,比如NVelocity

收获园豆:10
快速开发平台 | 园豆:177 (初学一级) | 2012-09-16 12:07

其实这种需求并不奇怪,但是对于编译型语言来讲就很难实现了,这个东西对于动态脚本语言来说是个易如反掌的操作。我只是想知道C#能否实现类似的功能,如果可行的话很多操作都可以呈几何级数量的减轻代码编写量和简化设计模式。

支持(0) 反对(0) 卓酷 | 园豆:65 (初学一级) | 2012-09-16 23:19
0

当然可以。

不过,你首先要弄清楚你所谓的“上下文”其实是一个特定的对象。例如最典型的HttpContext.Current。有了这个对象,你就可以递归遍历其所有属性。当然,碰到集合要遍历集合。每次都比较一下当前item的GetType().FullName(应该是这样,没开VS,不敢确定)获取当前item的类型的全名来和你的已知值对比。就能找到符合此类型的对象。

当然,比用FullName来做字符串比对更好的做法应该是先用Type.GetType(typeName)方法获取目标类型的Type实例,然后用is关键字来判断当前item是否为目标类型实例。这种做法能通吃继承和接口实现。

最后提醒一下,为了提高性能,你最好比较明确知道你要找的对象在上下文对象的“哪里”,譬如,你知道你的目标对象存在于HttpContext.Current.Items中,那么,你直接遍历Items集合会省事很多。

收获园豆:10
追萝驴 | 园豆:281 (菜鸟二级) | 2012-09-16 23:08
0

你可以试试C#的dynamic关键字, 也许你要的其实是这个。

收获园豆:10
undefined | 园豆:898 (小虾三级) | 2012-09-21 17:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册