C# 反射加载接口


1 . 新建接口类 Imanager

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InterfaceLoading
{
public interface Imanager
{
/// <summary>
/// 描述
/// </summary>
string Summary { get; set; }
/// <summary>
/// 加载类型,如Oracle,MySql,API等
/// </summary>
string LoadType { get; set; }

/// <summary>
/// 版本号
/// </summary>
int Ver { get;}

/// <summary>
///
/// </summary>
void Loadding();

}
}

2 . 新建接口实现子类1 Manager1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InterfaceLoading
{
public class Manager1 :Imanager
{
public static readonly Manager1 Instance = new Manager1();
public string Summary
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}

public string LoadType
{
get
{
return "Manager1";
}
set
{
value = LoadType;
}
}

public int Ver
{
get { throw new NotImplementedException(); }
}

public void Loadding()
{

}
}
}

 

3 . 新建接口实现子类2 Manager2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InterfaceLoading
{
public class Manager2:Imanager
{
public string Summary
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}

public string LoadType
{
get
{
return "Manager2";
}
set
{
value = LoadType;
}
}

public int Ver
{
get { throw new NotImplementedException(); }
}

public void Loadding()
{
throw new NotImplementedException();
}
}
}

4 . 创建接口加载提供类 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InterfaceLoading
{
public class LoadProvider
{
/// <summary>
/// 配置文件加载接口
/// </summary>
public Imanager ConfigLoader { get; protected set; }

/// <summary>
/// 所有的配置文件加载类loader
/// </summary>
private Dictionary<string, Imanager> loaders = new Dictionary<string, Imanager>();
/// <summary>
/// 所有的配置文件加载类loader
/// </summary>
public Dictionary<string, Imanager> Loaders
{
get { return loaders; }
}
public void Load()
{
// 反射加载接口Imanager的实现集合
var types = GetType().Assembly.GetTypes().Where(p=>p.GetInterface(typeof(Imanager).FullName)!=null);
foreach (var ctype in types)
{
Imanager cload = Activator.CreateInstance(ctype) as Imanager;
if (cload != null)
{
if (!Loaders.ContainsKey(cload.LoadType))
{
Loaders.Add(cload.LoadType, cload);
}
}
}
//设置默认的配置读取信息
this.SetDefaultLoader(System.Configuration.ConfigurationManager.AppSettings["ConfigType"]);
}

/// <summary>
/// 设置默认的加载接口
/// </summary>
/// <param name="loaderType">加载类型 Oacle,File等</param>
public void SetDefaultLoader(string loaderType)
{
if (!string.IsNullOrEmpty(loaderType))
{
foreach (var loader in loaders)
{
if (loader.Key.ToUpper() == loaderType.ToUpper())
{
ConfigLoader = loader.Value;
break;
}
}
if (ConfigLoader == null)
{
//LogProvider.Create().WriteLog(inCom.Logs.ErrorCodes.StaticErrorCodes.x000001, "不支持当前的配置文件读取方式,当前要求的读取方式是:" + loaderType, AppDomain.CurrentDomain.BaseDirectory, "");
}

}
else
{
// LogProvider.Create().WriteLog(inCom.Logs.ErrorCodes.StaticErrorCodes.x000001, "不支持当前的配置文件读取方式,当前要求的读取方式是:" + loaderType, "", "");
}
}

}
}

5 . 启动加载

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InterfaceLoading
{
class Program
{
static void Main(string[] args)
{
LoadProvider lp = new LoadProvider();
lp.Load();
Console.Read();
}
}
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM