C# 根据字符串值创建对象的方法有哪些?

C# 根据字符串值创建对象的方法有哪些?,c#,design-patterns,C#,Design Patterns,我有不同类型的提供者。这将提供来自不同来源的数据。另外,我在数据库中有一个表,在其中我可以找到用于特定团队的提供者 第1组-第一供应商 第2组-第二供应商等 根据团队的不同,我希望使用适当的提供者来获取团队的特定数据 string providerType = ... IProvider provider; if(providerType == "FirstProvider") { provider = new FirstProvider(); } else if(providerT

我有不同类型的提供者。这将提供来自不同来源的数据。另外,我在数据库中有一个表,在其中我可以找到用于特定团队的提供者

第1组-第一供应商

第2组-第二供应商等

根据团队的不同,我希望使用适当的提供者来获取团队的特定数据

string providerType = ...
IProvider provider;
if(providerType == "FirstProvider") 
{
    provider = new FirstProvider();
} 
else if(providerType == "SecondProvider")
{
    provider = new FirstProvider;
}
这样做的最佳模式/方式是什么?也许有些对象工厂…

匿名生成器方法字典 在此模式中,我们声明一个字典,其中:

键是提供程序名称字符串 该值是一个Func对象—一个没有参数且返回IProvider类型值的方法 静态只读字典提供程序BuilderMap= 新DictionaryStringComparer.OrdinalIgnoreCase { {firstProviderName,=>{返回新的FirstProvider;}} }; 上述声明:

声明一个只读字典对象,以指示此对象是只读引用且不应更改 可选包括StringComparer.OrdinalIgnoreCase参数,以使键比较不区分大小写 根据需要使用键值对初始化字典 该值是一个匿名方法,返回实现IProvider的对象 我们可以使用此字典创建所需的对象:

静态IProvider GetProviderUsingTypeBuilderstring名称 { Func providerBuilder=null; 如果ProviderBuilderMap.TryGetValuename,则输出providerBuilder { 返回providerBuilder; } //选择抛出异常或返回空值 //抛出新ArgumentOutOfRangeExceptionname,未找到提供程序。; 返回null; } 类型词典 在此模式中,我们声明一个字典,其中:

键是提供程序名称字符串 该值只是我们需要创建的实例的类型 静态只读字典providerTypeMap=新字典 { {firstProviderName,typeofFirstProvider} }; 我们需要使用反射来创建所需对象的实例。这可能比第一个匿名构建器方法的模式字典更昂贵:

static IProvider GetProviderUsingTypeConstructor(string name)
{
    Type providerType = null;
    if (providerTypeMap.TryGetValue(name, out providerType))
    {
        var constructor = providerType.GetConstructor(Type.EmptyTypes);
        return (IProvider)constructor.Invoke(null);
    }

    //throw new ArgumentOutOfRangeException("name", "Provider not found.");
    return null;
}
注意,在上述方法中,我们获取并调用providerType的无参数构造函数。如果无参数构造函数不存在,将发生运行时异常

关于只读词典的注记 上述示例中使用的providerBuilderMap和providerTypeMap对象是只读的。但是,Dictionary对象的元素不是只读的。如果需要,我们可以通过将声明更改为ReadOnlyDictionary来防止添加或删除元素。例如:

使用System.Collections.ObjectModel; 静态readonly ReadOnlyDictionary providerBuilderMap=新的ReadOnlyDictionary 新DictionaryStringComparer.OrdinalIgnoreCase { {firstProviderName,=>{返回新的FirstProvider;}} };
研究策略模式你读过关于设计模式的书吗?您可以在这里使用的模式是要实现的解释最多、最简单的创造性模式。请阅读。你会知道的。