我要写一个方法传过来一个对象的实例,可以使任何类我要遍历这个实例拥有多少成员和属性,并且要知道他们的名字,请问怎么写这个方法?
解决方案 »
- 懂axWindowsMediaPlayer的高手们,求帮忙!
- 找不到存储过程
- 在app.config中 数据库密码包含‘&’字符的话 应该怎么处理?
- 合并分页思路(多线程下)
- c#.net 远程访问数据库解决方案
- 请问msdn中的System.Threading.Thread.Join方法的说明是:阻塞调用线程,直到某个线程终止时为止"中的调用线程是指哪个线程?
- 残影问题,请各位高手指点
- 关于 XML - DOM 的问题 , 在线等待 (QQ: 9531511) , 100 分
- 谁有好的混淆器?
- 真正的《c#高级编程》中文第三版
- 请求解答:获取网址中的文件名字!!!!!!!!!!!!!!!!
- 安装程序
下面的程序是一个名为ReflectionExample的简单项目,里面包括MainClass.cs和InstanceClass.cs两个文件,MainClass里面利用字符串来创建InstanceClass类并且调用InstanceClass中的属性和方法,其中包括调用缺省构造函数和调用重载构造函数、调用无参数的成员函数和带参数的成员函数四个方法,还有一个ReturnString属性,程序如下。
InstanceClass.cs文件
using System;namespace ReflectionExample
{
/// <summary>
/// InstanceClass 的摘要描述。
/// </summary>
public class InstanceClass
{
private string returnString;
public string ReturnString
{
get { return returnString ; }
set { returnString = value ;}
} public InstanceClass()
{
//
// TODO: 在此加入建构函式的程序代码
//
this.returnString = "Creat object without Parameter";
} public InstanceClass( string str )
{
this.returnString = str;
} public void FunctionWithoutParameter()
{
Console.WriteLine( "Function Without Parameter" );
} public void FunctionWithParameter( string str )
{
Console.WriteLine( str );
}
}
}
MainClass.cs文件
using System;
using System.Reflection;namespace ReflectionExample
{
/// <summary>
/// Class1 的摘要描述。
/// </summary>
class MainClass
{
private Type type = null;
/// <summary>
/// 应用程序的主进入点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此加入启动应用程序的程序代码
//
Type type = typeof(InstanceClass);//利用typeof来获得InstanceClass类型。
MainClass mainClass = new MainClass(type);//初始化MainClass类
mainClass.GetObjectMethod();//调用无参数的函数
mainClass.GetObjectMethod( "Function With Parameter" );//调用带参数的函数
mainClass.GetObjectProperty();//调用缺省构造函数来初始化InstanceClass中的ReturnString属性
mainClass.GetObjectProperty("Creat object with Parameter");//调用重载构造函数来初始化InstanceClass中的ReturnString属性
} public MainClass( Type type )
{
this.type = type ;
} public void GetObjectMethod()
{
try
{
//Activator.CreateInstance()调用类的缺省构造函数来创建实例
object o = Activator.CreateInstance( type );
//利用MethodInfo类来获得从指定类中的成员函数
MethodInfo mi = type.GetMethod("FunctionWithoutParameter" );
//调用此成员函数
mi.Invoke( o , null );
}
catch( Exception ex )
{
Console.WriteLine( ex.Message );
}
finally
{
Console.ReadLine();
}
} public void GetObjectMethod( string str )
{
try
{
object o = Activator.CreateInstance( type );
//利用MethodInfo类来获得从指定类中符合条件的成员函数
MethodInfo mi = type.GetMethod( "FunctionWithParameter" , BindingFlags.Public |BindingFlags.Instance , null , new Type[]{ typeof(string) } , null );
mi.Invoke( o , new object[]{ str } );
}
catch( Exception ex )
{
Console.WriteLine( ex.Message );
}
finally
{
Console.ReadLine();
}
} public void GetObjectProperty( )
{
try
{
object o = Activator.CreateInstance( type );
//利用PropertyInfo类来获得从指定类中的属性
PropertyInfo pi = type.GetProperty( "ReturnString" , typeof(string) );
//打印属性值
Console.WriteLine( pi.GetValue( o , null ) );
}
catch( Exception ex )
{
Console.WriteLine( ex.ToString() );
}
finally
{
Console.ReadLine();
}
} public void GetObjectProperty( string str )
{
try
{
//Activator.CreateInstance()调用类的重载构造函数来创建实例
object o = Activator.CreateInstance( type , new object[]{ "Creat object with Parameter" } );
PropertyInfo pi = type.GetProperty( "ReturnString" , typeof(string) );
Console.WriteLine( pi.GetValue( o , null ) );
}
catch( Exception ex )
{
Console.WriteLine( ex.ToString() );
}
finally
{
Console.ReadLine();
}
}
}
}
{
Type t = obj.GetType();
MemberInfo[] myMember = t.GetMembers();
foreach (MemberInfo m in myMember)
{
Console.WriteLine("Name: " + m.Name + "\t\tMemberType: " + m.MemberType.ToString());
}
}
public class Student
{
private string sno;
private string sname;
public string Sno
{
get { return sno; }
set { this.sno = value; }
}
public string Sname
{
get { return sname; }
set { this.sname = value; }
}
public Student()
{
}
private string ReturnString()
{
return sno + sname;
}
public void OutputInfor()
{
Console.WriteLine("OutputInfor");
}
}测试:
class Program
{
static void Main(string[] args)
{
Student st = new Student();
PrintInstanceInfor(st);
}
static void PrintInstanceInfor(object obj)
{
Type t = obj.GetType();
MemberInfo[] myMember = t.GetMembers();
foreach (MemberInfo m in myMember)
{
Console.WriteLine("Name: " + m.Name + "\t\tMemberType: " + m.MemberType.ToString());
}
}
}输出如下:
Name: get_Sno MemberType: Method
Name: set_Sno MemberType: Method
Name: get_Sname MemberType: Method
Name: set_Sname MemberType: Method
Name: OutputInfor MemberType: Method
Name: GetType MemberType: Method
Name: ToString MemberType: Method
Name: Equals MemberType: Method
Name: GetHashCode MemberType: Method
Name: .ctor MemberType: Constructor
Name: Sno MemberType: Property
Name: Sname MemberType: Property
可以通过BindingFlags来进行控制...for example:
class Program
{
static void Main(string[] args)
{
Student st = new Student();
PrintInstanceInfor(st);
}
static void PrintInstanceInfor(object obj)
{
Type t = obj.GetType();
MemberInfo[] myMember = t.GetMembers(BindingFlags .Instance |BindingFlags .DeclaredOnly |BindingFlags .Public |BindingFlags .NonPublic);
foreach (MemberInfo m in myMember)
{
Console.WriteLine("Name: " + m.Name + "\t\tMemberType: " + m.MemberType.ToString());
}
}
}输出如下:
Name: get_Sno MemberType: Method
Name: set_Sno MemberType: Method
Name: get_Sname MemberType: Method
Name: set_Sname MemberType: Method
Name: ReturnString MemberType: Method
Name: OutputInfor MemberType: Method
Name: .ctor MemberType: Constructor
Name: Sno MemberType: Property
Name: Sname MemberType: Property
Name: sno MemberType: Field
Name: sname MemberType: Field