首页 > 其他 > 详细

插件开发

时间:2017-05-29 18:51:28      阅读:268      评论:0      收藏:0      [点我收藏+]
    public class Loader {

        public IEnumerable<Type> AllTypes { get; set; }
        private List<object> allInstances = new List<object>();

        public event EventHandler<UnhandledExceptionEventArgs> LoadingError;

        public void LoadFromFolder(string folder) =>
            AllTypes = Directory.GetFiles(folder, "*.dll").SelectMany(f => {
                IEnumerable<Type> ts;
                try {
                    ts = Assembly.LoadFile(f).ExportedTypes;
                } catch {
                    return Enumerable.Empty<Type>();
                }
                return ts;
            });

        public T Instance<T>() =>
            Instances<T>(false, t => true).FirstOrDefault();

        public IEnumerable<T> Instances<T>() =>
            Instances<T>(false, t => true);

        public T Instance<T>(bool createNew, Func<T, bool> filter) =>
            Instances(createNew, filter).FirstOrDefault();

        public IEnumerable<T> Instances<T>(bool createNew, Func<T, bool> filter) {
            var bt = typeof(T);
            var ii = bt.IsInterface;
            return from type in AllTypes
                   where !type.IsInterface && !type.IsAbstract && (ii ? type.GetInterfaces().Contains(bt) : type.IsSubclassOf(bt))
                   let r = (T)create(type, createNew)
                   where filter(r)
                   select r;
        }

        private object create(Type type, bool createNew) {
            var r = allInstances.FirstOrDefault(i => i.GetType() == type) ?? Activator.CreateInstance(type);
            if (createNew) {
                allInstances.Remove(r);
            }
            allInstances.Add(r);
            return r;
        }
    }

 

插件开发

原文:http://www.cnblogs.com/ly45/p/6918690.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!