📄 providershelper.cs
字号:
//===============================================================================
// CSDN HeyCache
//===============================================================================
// 修改记录:[按最后修改时间倒排序]
// 2007.06.11 by tangwei
//
// 代码来源:参考于.net frameworks
//===============================================================================
namespace HeyCacher.Providers.Common
{
using System;
using System.Collections.Specialized;
using System.Configuration;
using System.Configuration.Provider;
using System.Security.Permissions;
using System.Web;
using System.Xml;
/// <summary>
/// Provider的Helper类,主要用于创建Provider对象用
/// </summary>
public class ProvidersHelper
{
/// <summary>
/// 获取一个Provider的实例
/// </summary>
/// <param name="providerSettings"></param>
/// <param name="providerType"></param>
/// <returns></returns>
public static ProviderBase InstantiateProvider(ProviderSettings providerSettings, Type providerType)
{
ProviderBase abstractProvider = null; //抽象对象
try
{
//获取Provider的类型名称字符串
string ProviderTypeName = (providerSettings.Type == null) ? null : providerSettings.Type.Trim();
if (string.IsNullOrEmpty(ProviderTypeName))
{
throw new ArgumentException("Provider_no_type_name");
}
//获取Provider的实际类型,非抽象类型
Type ProviderType = GetType(ProviderTypeName, "type", providerSettings);
if (!providerType.IsAssignableFrom(ProviderType))
{
throw new ArgumentException("Provider_must_implement_type");
}
//通过ProviderType来创建一个真实的Provider对象,非抽象
abstractProvider = (ProviderBase)Activator.CreateInstance(ProviderType);
//建立config
NameValueCollection config = new NameValueCollection(providerSettings.Parameters.Count, StringComparer.Ordinal);
foreach (string tmpKey in providerSettings.Parameters)
{
config[tmpKey] = providerSettings.Parameters[tmpKey];
}
//调用Provider的初始化
abstractProvider.Initialize(providerSettings.Name, config);
}
catch (Exception exception)
{
if (exception is ConfigurationException)
{
throw;
}
throw new ConfigurationErrorsException(exception.Message, providerSettings.ElementInformation.Properties["type"].Source, providerSettings.ElementInformation.Properties["type"].LineNumber);
}
return abstractProvider;
}
/// <summary>
/// 获取一组Provider的实例集合
/// </summary>
/// <param name="configProviders"></param>
/// <param name="providers"></param>
/// <param name="providerType"></param>
public static void InstantiateProviders(ProviderSettingsCollection configProviders, ProviderCollection providers, Type providerType)
{
foreach (ProviderSettings settings in configProviders)
{
providers.Add(InstantiateProvider(settings, providerType));
}
}
/// <summary>
/// 取得类型
/// </summary>
/// <param name="typeName">类型名称字符串</param>
/// <param name="propertyName">异常时用</param>
/// <param name="configElement">异常时用</param>
/// <returns></returns>
internal static Type GetType(string typeName, string propertyName, ConfigurationElement configElement)
{
Type myType; //获取的类型结果
try
{
//在asp.net程序集中按类型名称检索类型
//myType = System.Web.Compilation.BuildManager.GetType(typeName, true, true);
myType = System.Type.GetType(typeName);
}
catch (Exception exception)
{
//线程错误等错误直接抛出
if (((exception is System.Threading.ThreadAbortException) || (exception is StackOverflowException)) || (exception is OutOfMemoryException))
{
throw;
}
//否则为配置错误
throw new ConfigurationErrorsException(exception.Message, exception, configElement.ElementInformation.Properties[propertyName].Source, configElement.ElementInformation.Properties[propertyName].LineNumber);
}
//返回类型
return myType;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -