cSharp:use Activator.CreateInstance with an Interface?
///<summary>
///数据访问工厂
///生成時間2015-2-13 10:54:34
///塗聚文(Geovin Du)
/// (利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口)
///</summary>
public class AbstractFactory
{ protected static string path = ConfigurationManager.AppSettings["WebDAL"]; //"DAL";//生成的DLL文件名 /// <summary>
/// 数据库类型
/// </summary>
protected static string dalType
{ get
{
if (path.Contains("AccessDAL"))
{
//path = "AcessDAL";
return "AccessDAL";
}
else if (path=="DAL")
{
// path = "DAL";//生成的DLL文件名
return "SqlServerDAL";//命名空间名称
}
else if (path.Contains("MySQLDAL"))
{
return "MySQLDAL";
}
else if (path.Contains("DALSQLite"))
{
//path = "DALSQLite";
return "SQLiteDAL";
}
else if (path.Contains("PostgreSQLDAL"))
{
// path = "DALPostgreSQL";
return "PostgreSQLDAL";
}
else if (path.Contains("OracleDAL"))
{
return "OracleDAL";
}
else
{
//path = "DAL";
return "SqlServerDAL";
}
}
} public AbstractFactory()
{ } ///<summary>
///分页接口
/// </summary>
///<returns></returns>
public static ISelectPage CreateSelectPage()
{
//ISelectPage page = new SelectPage();
//return page;
string className = "GeovinDu." + dalType + ".SelectPage";
return (ISelectPage)Assembly.Load(path).CreateInstance(className); //命名空间名称GeovinDu.SqlServerDAL
//path = "AcessDAL";//生成的DLL文件名 } ///<summary>
///CompanyBranch接口
/// </summary>
///<returns></returns>
public static ICompanyBranch CreateCompanyBranch(string _databaseprefix, string _sysdatarolefix)
{
//ICompanyBranch iCompanyBranch = new CompanyBranchDAL();
//return iCompanyBranch;
string className = "GeovinDu." + dalType + ".CompanyBranchDAL";//(_databaseprefix, _sysdatarolefix)
return (ICompanyBranch)Assembly.Load(path).CreateInstance(className); //GeovinDu.SqlServerDAL
} ///<summary>
///EnterpriseType接口
/// </summary>
///<returns></returns>
public static IEnterpriseType CreateEnterpriseType(string _databaseprefix, string _sysdatarolefix)
{
//IEnterpriseType iEnterpriseType = new EnterpriseTypeDAL();
//return iEnterpriseType;
string className = "GeovinDu." + dalType + ".EnterpriseTypeDAL";
return (IEnterpriseType)Assembly.Load(path).CreateInstance(className);
} ///<summary>
///LoginDiaryList接口
/// </summary>
///<returns></returns>
public static ILoginDiaryList CreateLoginDiaryList(string _databaseprefix, string _sysdatarolefix)
{
//ILoginDiaryList iLoginDiaryList = new LoginDiaryListDAL();
//return iLoginDiaryList;
string className = "GeovinDu." + dalType + ".LoginDiaryListDAL";//(_databaseprefix, _sysdatarolefix)
return (ILoginDiaryList)Assembly.Load(path).CreateInstance(className);
} ///<summary>
///OperatingUser接口
///https://msdn.microsoft.com/zh-cn/library/ms173128(VS.80).aspx
///https://stackoverflow.com/questions/2202381/reflection-how-to-invoke-method-with-parameters
/// </summary>
///<returns></returns>
public static IOperatingUser CreateOperatingUser(string _databaseprefix, string _sysdatarolefix)
{
//IOperatingUser iOperatingUser = new OperatingUserDAL(_databaseprefix, _sysdatarolefix);
//return iOperatingUser;
IOperatingUser iOperatingUser = null;
string className = "GeovinDu." + dalType + ".OperatingUserDAL";//(_databaseprefix, _sysdatarolefix)
//return (IOperatingUser)Assembly.Load(path).CreateInstance(className); //string className = "GeovinDu.SQLiteDAL.OperatingUserDAL";
//Assembly assembly = Assembly.LoadFrom(@"G:\winxp备份\PayrollPrint4\PayrollPrint\bin\Release\DALSQLite.dll");
// object oo = assembly.CreateInstance(className); //得到对象命名空间名
// MethodInfo methodinfo = assembly.GetType("GeovinDu.GeovinDu.SQLiteDAL.OperatingUserDAL").GetMethod("OperatingUserDAL"); //得到方法
//Object obj = methodinfo.Invoke(oo, new object[] { _databaseprefix, _sysdatarolefix });
//IOperatingUser iOperatingUser = (IOperatingUser)obj;
object obj = Assembly.Load(path).CreateInstance(className);
Type t2 = obj.GetType();// Type.GetType("GeovinDu.SQLiteDAL.OperatingUserDAL", false, true);
if (t2 != null)
{
iOperatingUser = (OperatingUserDAL)Activator.CreateInstance(t2, new object[] { }); //Assembly.Load(path).CreateInstance(className); //值為空
} //iOperatingUser = (IOperatingUser)Activator.CreateInstance(System.Type.GetType(className)); return iOperatingUser; } ///<summary>
///PrintWordDocumentTemplateList接口
/// </summary>
///<returns></returns>
public static IPrintWordDocumentTemplateList CreatePrintWordDocumentTemplateList(string _databaseprefix, string _sysdatarolefix)
{
//IPrintWordDocumentTemplateList iPrintWordDocumentTemplateList = new PrintWordDocumentTemplateListDAL();
//return iPrintWordDocumentTemplateList;
string className = "GeovinDu." + dalType + ".PrintWordDocumentTemplateListDAL";//(_databaseprefix, _sysdatarolefix)
return (IPrintWordDocumentTemplateList)Assembly.Load(path).CreateInstance(className);
} /// <summary>
///
/// </summary>
/// <returns></returns>
public static ISysConfig CreateSysConfig()
{ string className = "GeovinDu." + dalType + ".SysConfigDAL";
return (ISysConfig)Assembly.Load(path).CreateInstance(className);
//databaseprefix = _databaseprefix;
//ISysConfig iSysConfig = new DAL.SysConfigDAL();
//return iSysConfig;
}
}
https://github.com/fabriciorissetto/CustomActivator
https://www.codeproject.com/Articles/55710/Reflection-in-NET
https://www.codeproject.com/Articles/14593/A-General-Fast-Method-Invoker
https://github.com/ekonbenefits/impromptu-interface
https://www.codeproject.com/Articles/109868/General-DynamicObject-Proxy-and-Fast-Reflection-Pr
https://www.codeproject.com/articles/15089/an-abstract-factory-using-app-config-and-reflectio
https://www.microsoft.com/net/download/windows
/// <summary>
/// 无构造函数的用法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dllname"></param>
/// <param name="fullClassName"></param>
/// <returns></returns>
public static T CreateInstance<T>(string dllname, string fullClassName)
{
//string fullClassName = nameSpace + "." + className;
return (T)Assembly.Load(dllname).CreateInstance(fullClassName);
}
/// <summary>
/// 有構造函數的用法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dllname"></param>
/// <param name="fullName"></param>
/// <param name="parameters">构造函数的参数</param>
/// <returns></returns>
public static T CreateInstance<T>(string dllname, string fullName, object[] parameters)
{
try
{
//string fullName = nameSpace + "." + className;//命名空间.类型名
object ect = Assembly.Load(dllname).CreateInstance(fullName, true, System.Reflection.BindingFlags.Default | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, parameters, null, null);//加载程序集,创建程序集里面的 命名空间.类型名 实例
return (T)ect;//类型转换并返回
}
catch
{
//发生异常,返回类型的默认值
return default(T);
}
}
/// <summary>
/// 有構造函數的用法
/// geovindu
/// 塗聚文 涂聚文
/// Geovin Du
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="fullTypeName"></param>
/// <param name="paramArray">构造函数的参数</param>
/// <returns></returns>
public static T CreateInstance<T>(string fullTypeName, object[] parameters)
{
return (T)Activator.CreateInstance(Type.GetType(fullTypeName), parameters);
}
/// <summary>
/// 有構造函數的用法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dllname"></param>
/// <param name="fullTypeName"></param>
/// <param name="paramArray"></param>
/// <returns></returns>
public static T CreateInstanceActivator<T>(string dllname, string fullTypeName, object[] paramArray)
{
Assembly tempAssembly = Assembly.Load(dllname);
Type typeofControl = tempAssembly.GetType(fullTypeName);
return (T)Activator.CreateInstance(typeofControl, paramArray);
}
/// <summary>
/// 有構造函數的用法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="fullTypeName"></param>
/// <param name="paramArray"></param>
/// <returns></returns>
//public static T CreateInstance<T>(string fullTypeName, params object[] paramArray)
//{
// return (T)Activator.CreateInstance(Type.GetType(fullTypeName), args: paramArray);
//}
/// <summary>
/// 无构造函数的用法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="fullTypeName"></param>
/// <returns></returns>
public static T CreateInstance<T>(string fullTypeName)
{
return (T)Activator.CreateInstance(Type.GetType(fullTypeName));
}
string dir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string pdll = dir + @"\DALSQLite.dll";
Type type = Type.GetType("System.String");
object obj = Assembly.Load("DALSQLite").CreateInstance(className, true, System.Reflection.BindingFlags.Default | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, parameter, null, null);//className
//构造函数 Type t2 = obj.GetType();
object oodu = Activator.CreateInstance(t2,parameter);
//t2.GetConstructors
if (oodu != null)
{
string du = oodu.ToString();
} string[] str = { _databaseprefix, _sysdatarolefix }; //Type type = Type.GetType("System.String");
Assembly pluginAssembly = Assembly.LoadFrom(pdll);
Type dynclasstype = pluginAssembly.GetType(className); Type[] pt = new Type[2];
pt[0] = typeof(string);// typeof(string);
pt[1] = typeof(string);//typeof(string);
//object dynobj = Activator.CreateInstance(dynclasstype);//有構造函數不可以用
object dynobj = Activator.CreateInstance(dynclasstype,parameter);
if (dynobj != null)
{
dynobj.ToString();
ConstructorInfo[] cinfos = dynclasstype.GetConstructors();// (pt);
ConstructorInfo cinfo = cinfos[0];// dynclasstype.GetConstructor(pt); if (cinfo != null)
{
string na = cinfo.Name;
ParameterInfo[] psci = cinfo.GetParameters();
foreach (ParameterInfo pici in psci) //遍历并打印所该构造函数的所有参数
{
string nci=pici.ParameterType.ToString() + " :" + pici.Name + ",";
} }
} Type classType = pluginAssembly.GetType(className);
StringBuilder g = new StringBuilder();
ConstructorInfo[] ci = t2.GetConstructors(); //获取类的所有构造函数
foreach (ConstructorInfo c in ci) //遍历每一个构造函数
{
c.ToString();
ParameterInfo[] ps = c.GetParameters(); //取出每个构造函数的所有参数
foreach (ParameterInfo pi in ps) //遍历并打印所该构造函数的所有参数
{
g.Append(pi.ParameterType.ToString() + " :" + pi.Name + ",");
} }
cSharp:use Activator.CreateInstance with an Interface?的更多相关文章
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
EF Core使用SQL调用返回其他类型的查询 假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...
- Activator.CreateInstance 方法 (Type) 的用法
转自:http://www.cnblogs.com/lmfeng/archive/2012/01/30/2331666.html Activator.CreateInstance 方法 (Type) ...
- 用Activator.CreateInstance代替new实现类的实例化(转)
一直想得到这样一个函数,输入一个类的名称为参数,返回一个相应的类的实例. 这在工厂模式中是非常有用的 这样,可以使程序有更高的扩展性,例如,,下面的例子 如果现在有一个类,专门用来计算交通工具的速度, ...
- C# Activator.CreateInstance()
C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.CreateInstance (Type) 2. Activator.CreateInstance (Type, Objec ...
- C# Activator.CreateInstance 动态创建类的实例(二)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 用Activator.CreateInstance代替new实现类的实例化
一直想得到这样一个函数,输入一个类的名称为参数,返回一个相应的类的实例. 这在工厂模式中是非常有用的 这样,可以使程序有更高的扩展性,例如,,下面的例子 如果现在有一个类,专门用来计算交通工具的速度, ...
- C# Activator.CreateInstance()方法使用
C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.CreateInstance (Type) 2. Activator.CreateInstance (Type, Objec ...
- 注意Activator.CreateInstance两个重载方法的性能
今天扩展一个Type的扩展方法New: public static object New(this Type type, params object[] args) { Guard.ArgumentN ...
- 关于Assembly.CreateInstance()与Activator.CreateInstance()方法
于Assembly.CreateInstance()与Activator.CreateInstance()方法 动 态创建类对象,大多是Activator.CreateInstance()和Activ ...
随机推荐
- 1.开始学习ASP.NET MVC
Hello,大家好! 好久没有开始记录博客了,是时候开始分享一下了,这个系列主要为零基础的同学,量身打造的.废话不多说,我们开干! 什么是ASP.NET MVC MVC(Model-View-Cont ...
- Lambda表达式where过滤数据
使用Lambda的表达式来过滤符合条件的数据.下面的代码实现,是把字符阵列中,把名字长度等于3元素找出来. class Bv { public void LambdaExpression() { st ...
- Android开发工程师文集-layout_weight讲解
前言 大家好,给大家带来Android开发工程师文集-layout_weight讲解的概述,希望你们喜欢 Layout_weight的相关代码展示 <TextView android:layou ...
- JS应用实例4:表格隔行换色
HTML代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- SQLServer 查看耗时较多的SQL语句(转)
total_worker_time AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time AS [平均消耗CPU 时间(ms) ...
- NHibernate删除数据时遇到deleted object would be re-saved by cascade级联问题
今天在处理数据时遇到了这个问题,数据是一对多的关系,A包含多个B,想将某个B从A中移除,在保存时抛出如标题的问题,查找了下资料得知:由于在配置文件中设置了cascade为all,A和B存在级联关系,那 ...
- postgresql-磁盘空间不足问题排查
问题背景 加压测试过程中发现插入数据过程中报错:could not write to hash-join temporary file: 设备上没有空间.但是查看服务器还有很多空闲空间,是什么导致这样 ...
- Comparable接口和Comparator接口的不同用法
两者都可用来在定义比较方法,然后用在排序中. Comparable是类本身继承的接口 Comparator实在类外定义一个排序的类 比较而言,觉得Comparator更灵活一些,但是Comparabl ...
- 开源API测试工具 Hitchhiker v0.10 - 中文版
Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持自动化测试, 数据对比,压力测试,支持脚本定制请求,可以轻松部署到本地,和你的team成员一起协作测试Api. ...
- springboot配置监听器、过滤器和拦截器
监听器:listener是servlet规范中定义的一种特殊类.用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件.监听域对象的属性发生 ...