首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Activator.CreateInstance的C#

使用Activator.CreateInstance的C#
EN

Stack Overflow用户
提问于 2011-03-11 00:29:21
回答 6查看 74.4K关注 0票数 55

昨天我问了一个关于使用反射或策略模式来动态调用方法的问题。

但是,从那时起,我决定将这些方法更改为实现公共接口的单个类。原因是,每个类虽然有一些相似之处,但也执行某些特定于该类的方法。

我一直在使用这样的策略:

代码语言:javascript
运行
复制
switch (method)
{
    case "Pivot":
        return new Pivot(originalData);
    case "GroupBy":
        return new GroupBy(originalData);
    case "Standard deviation":
        return new StandardDeviation(originalData);
    case "% phospho PRAS Protein":
        return new PhosphoPRASPercentage(originalData);
    case "AveragePPPperTreatment":
        return new AveragePPPperTreatment(originalData);
    case "AvgPPPNControl":
        return new AvgPPPNControl(originalData);
    case "PercentageInhibition":
        return new PercentageInhibition(originalData);
    default:
        throw new Exception("ERROR: Method " + method + " does not exist.");
}

然而,随着潜在类的数量增加,我将需要不断添加新的类,从而打破关闭以进行修改的规则。

取而代之的是,我使用了一个解决方案:

代码语言:javascript
运行
复制
var test = Activator.CreateInstance(null, "MBDDXDataViews."+ _class);
       ICalculation instance = (ICalculation)test.Unwrap();
       return instance;

实际上,_class参数是在运行时传入的类名。这是一种常见的方法吗,这样做会有任何性能问题吗?

我对思考还很陌生,所以欢迎你的建议。

EN

Stack Overflow用户

发布于 2011-03-11 00:36:03

我建议你给你的工厂实现一个方法RegisterImplementation。因此,每个新类都只是对该方法的调用,您不需要更改工厂代码。

更新:

我的意思是这样的:

创建定义计算的接口。根据您的代码,您已经这样做了。为了完整起见,我将在接下来的回答中使用以下接口:

代码语言:javascript
运行
复制
public interface ICalculation
{
    void Initialize(string originalData);
    void DoWork();
}

您的工厂将如下所示:

代码语言:javascript
运行
复制
public class CalculationFactory
{
    private readonly Dictionary<string, Func<string, ICalculation>> _calculations = 
                        new Dictionary<string, Func<string, ICalculation>>();

    public void RegisterCalculation<T>(string method)
        where T : ICalculation, new()
    {
        _calculations.Add(method, originalData =>
                                  {
                                      var calculation = new T();
                                      calculation.Initialize(originalData);
                                      return calculation;
                                  });
    }

    public ICalculation CreateInstance(string method, string originalData)
    {
        return _calculations[method](originalData);
    }
}

出于简单性的原因,这个简单的工厂类缺少错误检查。

更新2:

您可以在应用程序初始化例程中的某个位置对其进行如下初始化:

代码语言:javascript
运行
复制
CalculationFactory _factory = new CalculationFactory();

public void RegisterCalculations()
{
    _factory.RegisterCalculation<Pivot>("Pivot");
    _factory.RegisterCalculation<GroupBy>("GroupBy");
    _factory.RegisterCalculation<StandardDeviation>("Standard deviation");
    _factory.RegisterCalculation<PhosphoPRASPercentage>("% phospho PRAS Protein");
    _factory.RegisterCalculation<AveragePPPperTreatment>("AveragePPPperTreatment");
    _factory.RegisterCalculation<AvgPPPNControl>("AvgPPPNControl");
    _factory.RegisterCalculation<PercentageInhibition>("PercentageInhibition");
}
票数 18
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5262693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档