• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
一个具有上进心的码农
因为一篇文章中有很多是从很多篇文章中摘取的,请恕我没有一一说明摘取出处,如果没有说明,则该文章默认是摘取,如有侵犯您的权益,请与我联系,将会马上删除。
博客园    首页    新随笔    联系   管理    订阅  订阅

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");
            }
        }
    }
}
posted @ 2009-04-30 09:06  不若相忘于江湖  阅读(296)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3