• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wayde


博客园    首页    新随笔    联系   管理    订阅  订阅
记录2
using System;
using System.Reflection;

namespace Kanas.Utils
{
    
/// <summary>
    
/// 反射实用程序类。
    
/// </summary>
    public class Reflection
    {
        
private Reflection()
        {}

        
#region 按描述建立对象实例

        
/// <summary>
        
/// 按指定的类型描述以默认的构造器建立一个任意类型。
        
/// </summary>
        
/// <param name="typeName">类型描述。</param>
        
/// <returns>返回的实例。</returns>
        public static object Instance(string typeName)
        {
            
return Instance(typeName, typeof(object));
        }

        
/// <summary>
        
/// 按指定的类型描述以默认的构造器建立一个类型。
        
/// </summary>
        
/// <param name="typeName">类型描述。</param>
        
/// <param name="expectedType">期望实现的类型。</param>
        
/// <returns>返回的实例。</returns>
        public static object Instance(string typeName, Type expectedType)
        {
            
return Instance(typeName, expectedType, null);
        }

        
/// <summary>
        
/// 按指定的类型描述建立一个类型。
        
/// </summary>
        
/// <param name="typeName">类型描述。</param>
        
/// <param name="expectedType">期望实现的类型。</param>
        
/// <param name="args">构造器参数。</param>
        
/// <returns>返回的实例。</returns>
        public static object Instance(string typeName, Type expectedType, params object[] args)
        {
            
if (typeName != null)
            {
                Type t 
= Type.GetType(typeName);
                
if (t != null)
                {
                    
if (expectedType.IsAssignableFrom(t))
                    {
                        
if (args == null)
                        {
                            
return Activator.CreateInstance(t);
                        }
                        
else
                        {
                            
return Activator.CreateInstance(t, args);
                        }
                    }
                    
else
                    {
                        
if (expectedType.IsInterface)
                        {
                            
// 指定的类型未实现所需接口
                            throw new ArgumentException(string.Format("指定的类型({0})未实现所期望的接口({1})", t.FullName, expectedType.FullName), "typeName");
                        }
                        
else
                        {
                            
// 指定的类型不是期望类型的派生类
                            throw new ArgumentException(string.Format("指定的类型({0})未实现期望的类型({1})的派生类", t.FullName, expectedType.FullName), "typeName");
                        }
                    }
                }
                
else
                {
                    
// 指定的类型不存在
                    throw new ArgumentException(string.Format("未找到指定的类型({0})", typeName), "typeName");
                }
            }
            
else
            {
                
// 未指定类型或接口的实现者
                throw new ArgumentException("未指定的类型的实现者", "typeName");
            }
        }

        
#endregion

        
#region 按描述读取实例属性值

        
/// <summary>
        
/// 按描述读取实例属性值。
        
/// </summary>
        
/// <param name="instance">对象实例。</param>
        
/// <param name="propertyName">属性名。</param>
        
/// <returns>返回属性值。</returns>
        public static object Property(object instance, string propertyName)
        {
            
return Property(instance, propertyName, null);
        }

        
/// <summary>
        
/// 按描述读取实例属性值。
        
/// </summary>
        
/// <param name="instance">对象实例。</param>
        
/// <param name="propertyName">属性名。</param>
        
/// <param name="args">属性参数表。</param>
        
/// <returns>返回属性值。</returns>
        public static object Property(object instance, string propertyName, params object[] args)
        {
            
if (instance == null)
            {
                
throw new ArgumentException("获取属性时实例不能为空。静态属性可用其Type实例", "instance");
            }
            Type t;
            BindingFlags flag 
= BindingFlags.IgnoreCase | BindingFlags.Public;
            
object inst;
            
if (instance is Type)
            {
                t 
= (Type) instance;
                flag 
|= BindingFlags.Static;
                inst 
= null;
            }
            
else
            {
                t 
= instance.GetType();
                flag 
|= BindingFlags.Instance;
                inst 
= instance;
            }
            
string pn = propertyName;
            
if ((args != null && args.Length > 0) && (pn == null || pn.Trim().Length == 0))
            {
                pn 
= "Item";
            }
            
if (pn != null)
            {
                PropertyInfo pi 
= t.GetProperty(pn, flag);
                
if (pi != null)
                {
                    
return pi.GetValue(inst, args);
                }
                
else
                {
                    
throw new ArgumentException("未发现指定名称的公共属性", pn);
                }
            }
            
else
            {
                
throw new ArgumentException("属性名不可为空,索引器属性必须指定索引序号", "propertyName");;
            }
        }

        
#endregion

        
#region 按描述执行指定方法

        
/// <summary>
        
/// 按描述执行指定的没有参数的方法。
        
/// </summary>
        
/// <param name="instance">对象实例。</param>
        
/// <param name="methodName">方法名。</param>
        
/// <returns>方法返回结果。</returns>
        public static object Invoke(object instance, string methodName)
        {
            
return Invoke(instance, methodName, null);
        }

        
/// <summary>
        
/// 按描述执行指定方法。
        
/// </summary>
        
/// <param name="instance">对象实例。</param>
        
/// <param name="methodName">方法名。</param>
        
/// <param name="args">方法参数。</param>
        
/// <returns>方法返回结果。</returns>
        public static object Invoke(object instance, string methodName, params object[] args)
        {
            
if (instance == null)
            {
                
throw new ArgumentException("执行方法时实例不能为空。静态方法可用其Type实例", "instance");
            }
            Type t;
            BindingFlags flag 
= BindingFlags.IgnoreCase | BindingFlags.Public;
            
object inst;
            
if (instance is Type)
            {
                t 
= (Type) instance;
                flag 
|= BindingFlags.Static;
                inst 
= null;
            }
            
else
            {
                t 
= instance.GetType();
                flag 
|= BindingFlags.Instance;
                inst 
= instance;
            }
            
if (methodName != null)
            {
                MethodInfo mi 
= t.GetMethod(methodName, flag);
                
if (mi != null)
                {
                    
if (args == null)
                    {
                        ParameterInfo[] pis 
= mi.GetParameters();
                        
if (pis.Length == 1)
                        {
                            
if (! pis[0].ParameterType.IsValueType)
                            {
                                args 
= new object[] {null};
                            }
                        }
                    }
                    
return mi.Invoke(inst, args);
                }
                
else
                {
                    
throw new ArgumentException("未发现指定名称的公共方法", methodName);
                }
            }
            
else
            {
                
throw new ArgumentException("方法名不可为空", "methodName");;
            }
        }

        
#endregion
    }
}
posted on 2007-09-17 17:52  wayde  阅读(191)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3