sort和反射封装方法
Code
Books是一个List的类型
bs.Books.Sort(delegate(Book a, Book b)
{
return a.Price.CompareTo(b.Price);
});
也可以使用 OrderBY 的方式
反射封装,, 里面是一些常用的反射功能
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace UsefulUtility
{
public class Invoker
{
private static BindingFlags flags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase;
public static Type GetType(Assembly asm, string typeFullName)
{
return asm.GetType(typeFullName);
}
public static Type GetInnerType(string hiddenTypeName, Type outerType)
{
Module typeModule = outerType.Module;
return typeModule.GetType(hiddenTypeName);
}
public static MethodInfo GetMethod(Type type, string funcName, Type[] paramTypes)
{
if (paramTypes != null)
return type.GetMethod(funcName, flags, null, paramTypes, null);
else
return type.GetMethod(funcName, flags);
}
public static MethodInfo GetMethod(Type type, string funcName)
{
return GetMethod(type, funcName, null);
}
public static object CallMethod(object obj, string funcName, params object[] parameters)
{
Type type = obj.GetType();
MethodInfo method = GetMethod(type, funcName, GetTypesFromObjects(parameters));
return method.Invoke(obj, parameters);
}
public static object CallStaticMethod(Type type, string funcName, params object[] parameters)
{
MethodInfo method = GetMethod(type, funcName, GetTypesFromObjects(parameters));
return method.Invoke(null, parameters);
}
public static object GetProperty(object obj, string propertyName)
{
return GetProperty(obj, propertyName, null);
}
public static object GetProperty(object obj, string propertyName, params object[] index)
{
Type type = obj.GetType();
return type.GetProperty(propertyName, flags).GetValue(obj, index);
}
public static object GetStaticProperty(Type type, string propertyName)
{
return GetStaticProperty(type, propertyName, null);
}
public static object GetStaticProperty(Type type, string propertyName, params object[] index)
{
return type.GetProperty(propertyName, flags).GetValue(null, index);
}
public static void SetProperty(object obj, string propertyName, object value)
{
SetProperty(obj, propertyName, value, null);
}
public static void SetProperty(object obj, string propertyName, object value, params object[] index)
{
Type type = obj.GetType();
type.GetProperty(propertyName, flags).SetValue(obj, value, index);
}
public static void SetStaticProperty(Type type, string propertyName, object value)
{
SetStaticProperty(type, propertyName, value, null);
}
public static void SetStaticProperty(Type type, string propertyName, object value, params object[] index)
{
type.GetProperty(propertyName, flags).SetValue(null, value, index);
}
public static object GetField(object obj, string fieldName)
{
Type type = obj.GetType();
return type.GetField(fieldName, flags).GetValue(obj);
}
public static object GetSaticField(Type type, string fieldName)
{
return type.GetField(fieldName, flags).GetValue(null);
}
public static void SetField(object obj, string fieldName, object value)
{
Type type = obj.GetType();
type.GetField(fieldName, flags).SetValue(obj, value);
}
public static void SetStaticField(Type type, string fieldName, object value)
{
type.GetField(fieldName, flags).SetValue(null, value);
}
private static ConstructorInfo GetConstructor(Type type, Type[] paramTypes)
{
return type.GetConstructor(paramTypes);
}
public static object CreateInstance(Type type, Type[] paramTypes, params object[] parameters)
{
return GetConstructor(type, paramTypes).Invoke(parameters);
}
public static object CreateInstance(Type type, params object[] parameters)
{
return GetConstructor(type, GetTypesFromObjects(parameters)).Invoke(parameters);
}
private static Type[] GetTypesFromObjects(object[] objs)
{
Type[] types = new Type[objs.Length];
for (int i = 0; i < types.Length; i++)
types[i] = objs[i].GetType();
return types;
}
public static void AddEventHandler(object obj, string eventName, MethodInfo method, object methodOwner)
{
EventInfo eventInfo = obj.GetType().GetEvent(eventName, flags);
Delegate eventDeleg = Delegate.CreateDelegate(eventInfo.EventHandlerType, methodOwner, method);
eventInfo.AddEventHandler(obj, eventDeleg);
}
public static void RemoveEventHandler(object obj, string eventName, MethodInfo method,object methodOwner)
{
EventInfo eventInfo = obj.GetType().GetEvent(eventName, flags);
Delegate eventDeleg = Delegate.CreateDelegate(eventInfo.EventHandlerType, methodOwner, method);
eventInfo.RemoveEventHandler(obj, eventDeleg);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using UsefulUtility;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static object sdk;
static Assembly asm;
[STAThread]
static void Main(string[] args)
{
// 载入程序集
asm = Assembly.LoadFrom("Fetion SDK.dll");
// 获取Fetion SDK的类型
Type type = Invoker.GetType(asm, "com.hetaoos.FetionSDK.FetionSDK");
// 实例化sdk
sdk = Invoker.CreateInstance(type);
// 获取账号管理的属性
object accountManager = Invoker.GetProperty(sdk, "AccountManager");
// 设置用户名和密码
Invoker.CallMethod(accountManager, "FillUserIdAndPassword", new object[] { "手机号码", "飞信密码", false });
// 监听事件
Invoker.AddEventHandler(sdk, "SDK_UserSatusChange", Invoker.GetMethod(typeof(Program), "sdk_SDK_UserSatusChange"), null);
// 调用登录方法
Invoker.CallMethod(accountManager, "Login");
}
static void Hello()
{
Console.WriteLine("hello in Hello");
}
static void sdk_SDK_UserSatusChange(object sender, EventArgs e)
{
Console.WriteLine(Invoker.GetProperty(e, "NewStatus"));
Console.WriteLine(Invoker.GetSaticField(Invoker.GetType(asm, "Imps.Client.UserAccountStatus"), "Logon"));
// 这里用==不好使,要用Equals,不知道为什么
if (Invoker.GetProperty(e, "NewStatus").Equals(Invoker.GetSaticField(Invoker.GetType(asm, "Imps.Client.UserAccountStatus"), "Logon")))
{
Console.WriteLine("hello");
object contactControl = Invoker.GetProperty(sdk, "ContactControl");
object sendSMS = Invoker.GetProperty(contactControl, "SendSMS");
Invoker.CallMethod(sendSMS, "SendSMS", "要发送信息的飞信号或手机号码", "hello, a test");
}
}
}
}
Books是一个List的类型
bs.Books.Sort(delegate(Book a, Book b)
{
return a.Price.CompareTo(b.Price);
});
也可以使用 OrderBY 的方式
反射封装,, 里面是一些常用的反射功能
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace UsefulUtility
{
public class Invoker
{
private static BindingFlags flags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase;
public static Type GetType(Assembly asm, string typeFullName)
{
return asm.GetType(typeFullName);
}
public static Type GetInnerType(string hiddenTypeName, Type outerType)
{
Module typeModule = outerType.Module;
return typeModule.GetType(hiddenTypeName);
}
public static MethodInfo GetMethod(Type type, string funcName, Type[] paramTypes)
{
if (paramTypes != null)
return type.GetMethod(funcName, flags, null, paramTypes, null);
else
return type.GetMethod(funcName, flags);
}
public static MethodInfo GetMethod(Type type, string funcName)
{
return GetMethod(type, funcName, null);
}
public static object CallMethod(object obj, string funcName, params object[] parameters)
{
Type type = obj.GetType();
MethodInfo method = GetMethod(type, funcName, GetTypesFromObjects(parameters));
return method.Invoke(obj, parameters);
}
public static object CallStaticMethod(Type type, string funcName, params object[] parameters)
{
MethodInfo method = GetMethod(type, funcName, GetTypesFromObjects(parameters));
return method.Invoke(null, parameters);
}
public static object GetProperty(object obj, string propertyName)
{
return GetProperty(obj, propertyName, null);
}
public static object GetProperty(object obj, string propertyName, params object[] index)
{
Type type = obj.GetType();
return type.GetProperty(propertyName, flags).GetValue(obj, index);
}
public static object GetStaticProperty(Type type, string propertyName)
{
return GetStaticProperty(type, propertyName, null);
}
public static object GetStaticProperty(Type type, string propertyName, params object[] index)
{
return type.GetProperty(propertyName, flags).GetValue(null, index);
}
public static void SetProperty(object obj, string propertyName, object value)
{
SetProperty(obj, propertyName, value, null);
}
public static void SetProperty(object obj, string propertyName, object value, params object[] index)
{
Type type = obj.GetType();
type.GetProperty(propertyName, flags).SetValue(obj, value, index);
}
public static void SetStaticProperty(Type type, string propertyName, object value)
{
SetStaticProperty(type, propertyName, value, null);
}
public static void SetStaticProperty(Type type, string propertyName, object value, params object[] index)
{
type.GetProperty(propertyName, flags).SetValue(null, value, index);
}
public static object GetField(object obj, string fieldName)
{
Type type = obj.GetType();
return type.GetField(fieldName, flags).GetValue(obj);
}
public static object GetSaticField(Type type, string fieldName)
{
return type.GetField(fieldName, flags).GetValue(null);
}
public static void SetField(object obj, string fieldName, object value)
{
Type type = obj.GetType();
type.GetField(fieldName, flags).SetValue(obj, value);
}
public static void SetStaticField(Type type, string fieldName, object value)
{
type.GetField(fieldName, flags).SetValue(null, value);
}
private static ConstructorInfo GetConstructor(Type type, Type[] paramTypes)
{
return type.GetConstructor(paramTypes);
}
public static object CreateInstance(Type type, Type[] paramTypes, params object[] parameters)
{
return GetConstructor(type, paramTypes).Invoke(parameters);
}
public static object CreateInstance(Type type, params object[] parameters)
{
return GetConstructor(type, GetTypesFromObjects(parameters)).Invoke(parameters);
}
private static Type[] GetTypesFromObjects(object[] objs)
{
Type[] types = new Type[objs.Length];
for (int i = 0; i < types.Length; i++)
types[i] = objs[i].GetType();
return types;
}
public static void AddEventHandler(object obj, string eventName, MethodInfo method, object methodOwner)
{
EventInfo eventInfo = obj.GetType().GetEvent(eventName, flags);
Delegate eventDeleg = Delegate.CreateDelegate(eventInfo.EventHandlerType, methodOwner, method);
eventInfo.AddEventHandler(obj, eventDeleg);
}
public static void RemoveEventHandler(object obj, string eventName, MethodInfo method,object methodOwner)
{
EventInfo eventInfo = obj.GetType().GetEvent(eventName, flags);
Delegate eventDeleg = Delegate.CreateDelegate(eventInfo.EventHandlerType, methodOwner, method);
eventInfo.RemoveEventHandler(obj, eventDeleg);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using UsefulUtility;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static object sdk;
static Assembly asm;
[STAThread]
static void Main(string[] args)
{
// 载入程序集
asm = Assembly.LoadFrom("Fetion SDK.dll");
// 获取Fetion SDK的类型
Type type = Invoker.GetType(asm, "com.hetaoos.FetionSDK.FetionSDK");
// 实例化sdk
sdk = Invoker.CreateInstance(type);
// 获取账号管理的属性
object accountManager = Invoker.GetProperty(sdk, "AccountManager");
// 设置用户名和密码
Invoker.CallMethod(accountManager, "FillUserIdAndPassword", new object[] { "手机号码", "飞信密码", false });
// 监听事件
Invoker.AddEventHandler(sdk, "SDK_UserSatusChange", Invoker.GetMethod(typeof(Program), "sdk_SDK_UserSatusChange"), null);
// 调用登录方法
Invoker.CallMethod(accountManager, "Login");
}
static void Hello()
{
Console.WriteLine("hello in Hello");
}
static void sdk_SDK_UserSatusChange(object sender, EventArgs e)
{
Console.WriteLine(Invoker.GetProperty(e, "NewStatus"));
Console.WriteLine(Invoker.GetSaticField(Invoker.GetType(asm, "Imps.Client.UserAccountStatus"), "Logon"));
// 这里用==不好使,要用Equals,不知道为什么
if (Invoker.GetProperty(e, "NewStatus").Equals(Invoker.GetSaticField(Invoker.GetType(asm, "Imps.Client.UserAccountStatus"), "Logon")))
{
Console.WriteLine("hello");
object contactControl = Invoker.GetProperty(sdk, "ContactControl");
object sendSMS = Invoker.GetProperty(contactControl, "SendSMS");
Invoker.CallMethod(sendSMS, "SendSMS", "要发送信息的飞信号或手机号码", "hello, a test");
}
}
}
}