在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1、 什么是反射 1 namespace N1 2 { 3 public class AC1 {…} 4 public class AC2 {…} 5 } 6 namespace N2 7 { 8 public class AC3 {…} 9 public class AC4{…} 10 } 装配件B: 1 namespace N1 2 { 3 public class BC1 {…} 4 public class BC2 {…} 5 } 6 namespace N2 7 { 8 public class BC3 {…} 9 public class BC4 {…} 10 } 这两个装配件中都有N1和N2两个命名空间,而且各声明了两个类,这样是完全可以的,然后我们在一个应用程序中引用装配件A,那么在这个应用程序中,我们能看到N1下面的类为AC1和AC2,N2下面的类为AC3和AC4。 接着我们去掉对A的引用,加上对B的引用,那么我们在这个应用程序下能看到的N1下面的类变成了BC1和BC2,N2下面也一样。 1 public interface IMediaFormat 2 { 3 string Extension {get;} 4 Decoder GetDecoder(); 5 }
这个接口中包含一个Extension属性,这个属性返回支持的扩展名,另一个方法返回一个解码器的对象(这里我假设了一个Decoder的类,这个类提供把文件流解码的功能,扩展插件可以派生之),通过解码器对象我就可以解释文件流。
1 … 2 public void Process( object processObj ) 3 { 4 Type t = processsObj.GetType(); 5 if( t.GetInterface(“ITest”) !=null ) 6 … 7 } 8 …
另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如: Type t = Type.GetType(“System.String”);
需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件,或者在已经获得的Assembly实例上面调用GetType。 Type t = Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 这样才可以,大家可以看下面这个帖子: http://expert.csdn.net/Expert/to ... 2.xml?temp=.1919977 1 Type t = Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 2 DataTable table = (DataTable)Activator.CreateInstance(t); 例二:根据有参数的构造器创建对象 1 namespace TestSpace 2 { 3 public class TestClass 4 { 5 private string _value; 6 public TestClass(string value) 7 { 8 _value=value; 9 } 10 } 11 } 12 … 13 Type t = Type.GetType(“TestSpace.TestClass”); 14 Object[] constructParms = new object[] {“hello”}; //构造器参数 15 TestClass obj = (TestClass)Activator.CreateInstance(t,constructParms); 16 …
把参数按照顺序放入一个Object数组中即可 1 namespace TestSpace 2 { 3 public class TestClass { 4 private string _value; 5 public TestClass() { } 6 public TestClass(string value) { 7 _value = value; 8 } 9 public string GetValue( string prefix ) { 10 if( _value==null ) 11 return "NULL"; 12 else 13 return prefix+" : "+_value; 14 } 15 public string Value { 16 set { _value=value; } 17 get { 18 if( _value==null ) 19 return "NULL"; 20 else 21 return _value; 22 } 23 } 24 } 25 }
上面是一个简单的类,包含一个有参数的构造器,一个GetValue的方法,一个Value属性,我们可以通过方法的名称来得到方法并且调用之,如: 1 //获取类型信息 2 Type t = Type.GetType("TestSpace.TestClass"); 3 //构造器的参数 4 object[] constuctParms = new object[]{"timmy"}; 5 //根据类型创建对象 6 object dObj = Activator.CreateInstance(t,constuctParms); 7 //获取方法的信息 8 MethodInfo method = t.GetMethod("GetValue"); 9 //调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值 10 BindingFlags flag = BindingFlags.Public | BindingFlags.Instance; 11 //GetValue方法的参数 12 object[] parameters = new object[]{"Hello"}; 13 //调用方法,用一个object接收返回值 14 object returnValue = method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);
属性与方法的调用大同小异,大家也可以参考MSDN 1 namespace TestSpace { 2 delegate string TestDelegate(string value); 3 public class TestClass { 4 public TestClass() { } 5 public void GetValue(string value) { 6 return value; 7 } 8 } 9 }
使用示例: 1 TestClass obj = new TestClass(); 2 //获取类型,实际上这里也可以直接用typeof来获取类型 3 Type t = Type.GetType(“TestSpace.TestClass”); 4 //创建代理,传入类型、创建代理的对象以及方法名称 5 TestDelegate method = (TestDelegate)Delegate.CreateDelegate(t,obj,”GetValue”); 6 String returnValue = method(“hello”);
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论