反射工厂

using System;
using System.Collections.Generic;
using System.Reflection;

namespace Beehive.CloudReader.Utility
{
    /// <summary>
    /// 反射工厂
    /// </summary>
    public abstract class FactoryBase
    {
        /// <summary>
        /// 
        /// </summary>
        protected FactoryBase() { }

        /// <summary>
        /// 
        /// </summary>
        protected static readonly SortedList<string, Type> Items = new SortedList<string, Type>();

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        protected static T CreateType<T>()
        {
            if (Items.ContainsKey(typeof(T).FullName))
            {
                return (T)Activator.CreateInstance<T>();
            }
            var attributes = typeof(T).GetCustomAttributes(typeof(ConcreteTypeAttribute), true);
            if (attributes.Length > 0 && attributes[0] is ConcreteTypeAttribute)
            {
                var facadeName = ((ConcreteTypeAttribute)attributes[0]).TypeName;
                var targetType = Type.GetType(facadeName);
                lock (Items)
                {
                    Items[typeof(T).FullName] = targetType;
                }
                return (T)Activator.CreateInstance(targetType);
            }
            return default(T);
        }
        /**Type t = typeof(string);
Type t = typeof(System.String);
Type 是抽象类, typeof(类名称) 返回的是继承自Type 的RuntimeType*/

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="path"></param>
        /// <param name="FullName"></param>
        /// <returns></returns>
        protected static T Create<T>(string path, string FullName)
        {
            return (T)Assembly.Load(path).CreateInstance(FullName);
        }
    }
}

 

posted on 2014-02-11 10:46  朝着  阅读(144)  评论(0编辑  收藏  举报