C#中如何用反射获取类的对象实例属性^^^^^^^^^^^^^^^^^^^^^

cefriend 2010-06-28 10:48:49
示例如下

三个类

类A
public class A { private string _a;
public string A
{get;set;}
}
类B
public class B {private string _b;
public string B
{get;set;}
}
类A_B
public claa A_B{
private A obj_A;
public A Obj_A{get;set;}

private List<B> obj_B;
public List<B> Obj_B{get;set;}
}

现在我想通过反射获取 A_B 类中的属性对象, 属性的类性,属性对象名 不知道如何得到
class program
{
public static void Main()
{

//1使用Type类提供的静态方法GetType()得到类对象
Type objType = Type.GetType("命名空间.A_B");


................这里不知道如何写,请教C#反射高手(我想得到 obj_A 对象的类型 obj_B对象类型)


}
}
...全文
2632 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnxthy 2011-08-21
  • 打赏
  • 举报
回复
学习~!
moxiaott 2011-07-06
  • 打赏
  • 举报
回复
楼上说的都对,不过说的都是屁话,既然要反射那这个反射类就应该是工厂类,这个类不会知道转换成什么类,直接返回object对象,所以用PropertyInfo屁都得不得,楼主还是使用这个
Object obj = new Object();
obj = Activator.CreateInstanceFrom("models.dll", "models.M3").Unwrap();
MemberInfo[] members = obj.GetType().GetMembers();
string s = "sss";
for(int i=0;i<members.Length;i++)
{
MessageBox.Show( members[i].Name+" "+members[i].ToString());//显示出属性名和属性数据类型
members[i].MemberType.ToString().Equals("Field");//可以判断出这个属性是不是自己添加的属性
}
//设置对象中某个属性的值"title"就是model属性你可以迭代赋值,可以通过上面的方法获取属性名动态赋值
obj.GetType().InvokeMember("title", BindingFlags.SetField, null, obj, new Object[] { s });
top_wo 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 cefriend 的回复:]

引用 5 楼 wuyq11 的回复:
PropertyInfo[] peroperties = typeof(A).GetProperties(BindingFlags.Public | BindingFlags.Instance);

foreach (PropertyInfo property in peroperties)
{
object[] objs = property.G……
[/Quote]

如果你连这个都有点看不懂,劝你还是放弃学编程吧,找点不用懂脑子的行业,其实也很好。
cefriend 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyq11 的回复:]
PropertyInfo[] peroperties = typeof(A).GetProperties(BindingFlags.Public | BindingFlags.Instance);

foreach (PropertyInfo property in peroperties)
{
object[] objs = property.GetCustomAttribu……
[/Quote]


这位楼主你的回答我没看明白,
  • 打赏
  • 举报
回复
靠,数组对象还不知道怎么用。。。不想多说了。走人
cefriend 2010-06-28
  • 打赏
  • 举报
回复
................这里不知道如何写,请教C#反射高手(我想得到 obj_A 对象的类型 obj_B对象类型)
上面的那位,那我问题我如何得到 obj_B 的对象类型 B 你们的那个方法得到的是 list 对象


自已跟个B一样

  • 打赏
  • 举报
回复
扯淡,这个就是从生产环境的代码中拷过来的。什么叫没测试
宇峰科技 2010-06-28
  • 打赏
  • 举报
回复
学习了
  • 打赏
  • 举报
回复
using System.Reflection;
cefriend 2010-06-28
  • 打赏
  • 举报
回复
没有得到,你们都没测试
RHCL 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cefriend 的回复:]
上面的几位,你们这种方法我是得不到的
[/Quote]
你引用了没
  • 打赏
  • 举报
回复
PropertyInfo类有MemberType, Name(属性对象名), PropertyType(属性的类性)等等属性,不知道楼主要的是什么信息?
angel6709 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 healer_kx 的回复:]
C# code

Type objType = Type.GetType("ConsoleApplication1.A_B");
PropertyInfo[] pi = objType.GetProperties();
Console.WriteLine(pi[0].PropertyType);



结贴吧。……
[/Quote]

给分呵呵
healer_kx 2010-06-28
  • 打赏
  • 举报
回复

Type objType = Type.GetType("ConsoleApplication1.A_B");
PropertyInfo[] pi = objType.GetProperties();
Console.WriteLine(pi[0].PropertyType);


结贴吧。
t20100504t 2010-06-28
  • 打赏
  • 举报
回复
up up ~
mapserver 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cefriend 的回复:]

上面的几位,你们这种方法我是得不到的
[/Quote]

怎么会得不到?????
把类和属性的代码贴出来。。。
wuyq11 2010-06-28
  • 打赏
  • 举报
回复
PropertyInfo[] peroperties = typeof(A).GetProperties(BindingFlags.Public | BindingFlags.Instance);

foreach (PropertyInfo property in peroperties)
{
object[] objs = property.GetCustomAttributes(typeof(DescriptionAttribute), true);
}
cefriend 2010-06-28
  • 打赏
  • 举报
回复
上面的几位,你们这种方法我是得不到的
mapserver 2010-06-28
  • 打赏
  • 举报
回复

命名空间.A_B obj = new 命名空间.A_B();
Type objType = Type.GetType("命名空间.A_B");
PropertyInfo propertyInfo = objType.GetProperty("PropertyName", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);

object propertyValue = propertyInfo.GetValue(obj, null);
  • 打赏
  • 举报
回复
PropertyInfo[] pinfo = objType.GetProperties();
加载更多回复(3)
两个现实的例子: 1、B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况。这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不知说得是否准确^_^)。 2、地球内部结构:地球的内部结构大体可以分为三层:地壳、地幔和地核。地壳是固体,地核是液体,地幔则是半液半固的结构(学地理的内容,大家还记得吧?)。如何在地球表面不用深入地球内部就知道其内部的构造呢?对,向地球发射“地震波”,“地震波”分两种一种是“横波”,另一种是“纵波”。“横波”只能穿透固体,而“纵波”既可穿透固体又可以穿透液体。通过在地面对纵波和横波的反回情况,我们就可以大体断定地球内部的构造了。 大家注意到这两个例子的共同特点,就是从一个对象的外部去了解对象内部的构造,而且都是利用了波的反射功能。在.NET反射也可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET反射还可以运态创建出对象并执行它其的方法。 反射是.NET的重要机制,通过反射,可以在运行时获得程序或程序集每一个型(包括、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个型了如指掌。另外我还可以直接创建对象,即使这个对象型在编译时还不知道。 反射的用途: (1)使用Assembly定义和加载程序集,加载在程序集清单列出模块,以及从此程序集查找型并创建该型的实例。 (2)使用Module了解包含模块的程序集以及模块等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。 (4)使用MethodInfo了解方法的名称、返回型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。 (5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。 (6)使用EventInfo了解事件的名称、事件处理程序数据型、自定义属性、声明型和反射型等,添加或移除事件处理程序。 (7)使用PropertyInfo了解属性的名称、数据型、声明型、反射型和只读或可写状态等,获取或设置属性值。 (8)使用ParameterInfo了解参数的名称、数据型、是输入参数还是输出参数,以及参数在方法签名的位置等。 反射用到的命名空间: System.Reflection System.Type System.Reflection.Assembly 反射用到的主要: System.Type --通过这个可以访问任何给定数据型的信息。 System.Reflection.Assembly--它可以用于访问给定程序集的信息,或者把这个程序集加载到程序。 System.Type: System.Type 对于反射起着核心的作用。但它是一个抽象的基,Type有与每种数据型对应的派生,我们使用这个派生对象的方法、字段、属性来查找有关该型的所有信息。 获取给定型的Type引用有3种常用方式: ●使用 C# typeof 运算符。 Type t = typeof(string); ●使用对象GetType()方法。 string s = "grayworm"; Type t = s.GetType(); ●还可以调用Type的静态方法GetType()。 Type t = Type.GetType("System.String"); 上面这三代码都是获取string型的Type,在取出string型的Type引用t后,我们就可以通过t来探测string型的结构了。 string n = "grayworm"; Type t = n.GetType(); foreach (MemberInfo mi in t.GetMembers()) { Console.WriteLine("{0}/t{1}",mi.MemberType,mi.Name); } Type属性: Name 数据型名 FullName 数据型的完全限定名(包括命名空间名) Namespace 定义数据型的命名空间名 IsAbstract 指示该型是否是抽象型 IsArray 指示该型是否是数组 IsClass 指示该型是否是 IsEnum 指示该型是否是枚举 IsInterface 指示该型是否是接口 IsPublic 指示该型是否是公有的 IsSealed 指示该型是否是密封 IsValueType 指示该型是否是值型 Type的方法: GetConstructor(), GetConstructors():返回ConstructorInfo型,用于取得该的构造函数的信息 GetEvent(), GetEvents():返回EventInfo型,用于取得该的事件的信息 GetField(), GetFields():返回FieldInfo型,用于取得该的字段(成员变量)的信息 GetInterface(), GetInterfaces():返回InterfaceInfo型,用于取得该实现的接口的信息 GetMember(), GetMembers():返回MemberInfo型,用于取得该的所有成员的信息 GetMethod(), GetMethods():返回MethodInfo型,用于取得该的方法的信息 GetProperty(), GetProperties():返回PropertyInfo型,用于取得该属性的信息 可以调用这些成员,其方式是调用Type的InvokeMember()方法,或者调用MethodInfo, PropertyInfo和其他的Invoke()方法。 查看的构造方法: NewClassw nc = new NewClassw(); Type t = nc.GetType(); ConstructorInfo[] ci = t.GetConstructors(); //获取的所有构造函数 foreach (ConstructorInfo c in ci) //遍历每一个构造函数 { ParameterInfo[] ps = c.GetParameters(); //取出每个构造函数的所有参数 foreach (ParameterInfo pi in ps) //遍历并打印所该构造函数的所有参数 { Console.Write(pi.ParameterType.ToString()+" "+pi.Name+","); } Console.WriteLine(); }

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧