楼主是要获取上下文中已经存在的对象实例,通过对象的类型名,而不是创建新的对象实例,这显然是做不到的,反射是必须指定具体对象或类型来反射的,你那种需求只能通过在创建对象时就将其缓存的方式来后期查找。
Activator.CreateInstance(System.Type.GetType("mynamespace.mycalss"))
第二个要有product对象引用才能取属性值。
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)); } } }
你最好说下你的应用场景,怎么会出现如此奇怪的需求
动态模版语言也许可以解决问题,比如NVelocity
其实这种需求并不奇怪,但是对于编译型语言来讲就很难实现了,这个东西对于动态脚本语言来说是个易如反掌的操作。我只是想知道C#能否实现类似的功能,如果可行的话很多操作都可以呈几何级数量的减轻代码编写量和简化设计模式。
当然可以。
不过,你首先要弄清楚你所谓的“上下文”其实是一个特定的对象。例如最典型的HttpContext.Current。有了这个对象,你就可以递归遍历其所有属性。当然,碰到集合要遍历集合。每次都比较一下当前item的GetType().FullName(应该是这样,没开VS,不敢确定)获取当前item的类型的全名来和你的已知值对比。就能找到符合此类型的对象。
当然,比用FullName来做字符串比对更好的做法应该是先用Type.GetType(typeName)方法获取目标类型的Type实例,然后用is关键字来判断当前item是否为目标类型实例。这种做法能通吃继承和接口实现。
最后提醒一下,为了提高性能,你最好比较明确知道你要找的对象在上下文对象的“哪里”,譬如,你知道你的目标对象存在于HttpContext.Current.Items中,那么,你直接遍历Items集合会省事很多。
你可以试试C#的dynamic关键字, 也许你要的其实是这个。