我正在实现一组C#类/接口,这些类/接口应该反映为基于输入字符串操作.基本上,在给定一个输入字符串的情况下,类/接口集应该标识输入并充当操作类.

我喜欢使用泛型,任何让它使用起来很舒服的模式.

Input examples:

1) ABC-{RandNumber(3)}
2) {CurrentNumber}
3) QWE-{RandString(5)}
4) ABY-{Date(yyyy)}

该接口表示一个操作:

public interface IAction 
{
}

Actions类表示合同操作

public abstract class Action: IAction
{
}

public sealed class RandonNumberAction : Action
{
}

public sealed class RandonStringAction : Action
{
}

现在问题来了.将输入字符串映射到真正的具体操作类的最佳方法是什么?倒影?仿制药?

推荐答案

在这里,Strategy模式可用于在运行时 Select 算法.然而,有必要将这些算法存储在某个地方.我认为,这是一个可以使用简单工厂的地方.

因此,您的类如下所示:

public interface IAction
{
}


public abstract class Action : IAction
{
}


public sealed class RandonNumberAction : Action
{
}


public sealed class RandonStringAction : Action
{
}

然后我们需要一个地方来存储这些策略,并在必要时采取它.这是一个可以使用简单工厂的地方.

public class ActionFactory
{
    private Dictionary<string, Action> _actionByType =
        new Dictionary<string, Action>()
    {
        { "foo", new  RandonNumberAction() },
        { "bar", new RandonStringAction()  }
    };

    public Action GetInstanceByInput(string input) => _actionByType[input];
}

Csharp相关问答推荐

Blazor:子编辑表单上的嵌套编辑表单验证

应用程序启动时出现错误:操作无法同时使用表单和SON主体参数

发布.NET框架项目将.NET核心元素注入到web. connect中

List T.AddRange在传递ConcurrentDictionary作为参数时引发ArgumentExcellent

利用.NET 8中的AddStandardResilienceDeliveries和AddStandardHedgingDeliveries实现Resiliency

ASP.NET Core:如何在IPageFilter中注入ApplicationDbContext

在FilePath中搜索一个词,并根据First Match从左到右提取文件路径

Thad.Sept()vs Task.Delay().Wait()

Take()方法如何与IAsyncEnumerable一起使用

Blazorise折线图仅绘制数据集的一部分

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

ASP.NET配置kestrel以使用Windows证书存储中的HTTPS

TCPClient阅读流

Automapper 12.x将GUID映射到字符串

EF核心区分大小写的主键

记录类型';==运算符是否与实现IEquatable<;T&>;的类中的';equals&>方法执行等价比较?

在使用UserManager时,如何包含与其他实体的关系?

为什么我可以在注册表编辑器中更改值,但不能在以管理员身份运行的C#表单应用程序中更改?

如何读取TagHelper属性的文本值?

获取应用程序版本信息时出现奇怪信息