6、如何获取方法以及动态调用方法
上面是一个简单的类,包含一个有参数的构造器,一个GetValue的方法,一个Value属性,我们可以通过方法的名称来得到方法并且调用之,如:
属性与方法的调用大同小异,大家也可以参考MSDN
//
获取类型信息
Type t = Type.GetType( " TestSpace.TestClass " );
// 构造器的参数
object [] constuctParms = new object [] ... {"timmy"} ;
// 根据类型创建对象
object dObj = Activator.CreateInstance(t,constuctParms);
// 获取方法的信息
MethodInfo method = t.GetMethod( " GetValue " );
// 调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
// GetValue方法的参数
object [] parameters = new object [] ... {"Hello"} ;
// 调用方法,用一个object接收返回值
object returnValue = method.Invoke(dObj,flag,Type.DefaultBinder,parameters, null );
Type t = Type.GetType( " TestSpace.TestClass " );
// 构造器的参数
object [] constuctParms = new object [] ... {"timmy"} ;
// 根据类型创建对象
object dObj = Activator.CreateInstance(t,constuctParms);
// 获取方法的信息
MethodInfo method = t.GetMethod( " GetValue " );
// 调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
// GetValue方法的参数
object [] parameters = new object [] ... {"Hello"} ;
// 调用方法,用一个object接收返回值
object returnValue = method.Invoke(dObj,flag,Type.DefaultBinder,parameters, null );
7、动态创建委托
委托是C#中实现事件的基础,有时候不可避免的要动态的创建委托,实际上委托也是一种类型:System.Delegate,所有的委托都是从这个类派生的
System.Delegate提供了一些静态方法来动态创建一个委托,比如一个委托:
namespace
TestSpace
...
{
delegate string TestDelegate(string value);
public class TestClass ...{
public TestClass() ...{
}
public void GetValue(string value) ...{
return value;
}
}
}
delegate string TestDelegate(string value);
public class TestClass ...{
public TestClass() ...{
}
public void GetValue(string value) ...{
return value;
}
}
}
使用示例:
TestClass obj
=
new
TestClass();
// 获取类型,实际上这里也可以直接用typeof来获取类型
Type t = Type.GetType(“TestSpace.TestClass”);
// 创建代理,传入类型、创建代理的对象以及方法名称
TestDelegate method = (TestDelegate)Delegate.CreateDelegate(t,obj,”GetValue”);
String returnValue = method(“hello”);
// 获取类型,实际上这里也可以直接用typeof来获取类型
Type t = Type.GetType(“TestSpace.TestClass”);
// 创建代理,传入类型、创建代理的对象以及方法名称
TestDelegate method = (TestDelegate)Delegate.CreateDelegate(t,obj,”GetValue”);
String returnValue = method(“hello”);
namespace
TestSpace
... {
public class TestClass
...{
private string _value;
public TestClass()
...{
}
public TestClass(string value)
...{
_value = value;
}
public string GetValue( string prefix )
...{
if( _value==null )
return "NULL";
else
return prefix+" : "+_value;
}
public string Value
...{
set ...{_value=value;}
get ...{
if( _value==null )
return "NULL";
else
return _value;
}
}
}
}
... {
public class TestClass
...{
private string _value;
public TestClass()
...{
}
public TestClass(string value)
...{
_value = value;
}
public string GetValue( string prefix )
...{
if( _value==null )
return "NULL";
else
return prefix+" : "+_value;
}
public string Value
...{
set ...{_value=value;}
get ...{
if( _value==null )
return "NULL";
else
return _value;
}
}
}
}