映射类c#

时间:2017-12-08 17:36:57

标签: c#

我正在编写一个转换器,它接受一些输入并提供输出。我需要根据我的输入类型调用特定的转换器。

public static myentrypoint( template t);
{
   //I could do something like this.
   switch(t)
   {
        case t1:
         transformt1(..);
        case t2:
         transformt1(..);
         ....
   }
}

Trasform1 : Itransform
{
    tranform1(...);
}

Trasform2 : Itransform
{
    tranform2(...);
}

我需要根据我的模板来映射要调用的函数。我可以做一个开关,但有更简洁的方法来使用一些设计模式吗?我在考虑编写静态字典。我是OOP的新手,所以任何建议都会很棒。

3 个答案:

答案 0 :(得分:1)

如果template是一个类,并且每个模板可能有不同的转换,那么为什么不在模板类中包含转换函数呢?

public static myentrypoint( ITemplate t);
{
   t.transform();
}

答案 1 :(得分:0)

我执行这些类型的情况的方式是使用Generics。 (Shameless self-promotion of a blog post

基本上,您的基类设置如下:

public abstract class Transformer<T>
    where T : Template
{
    public abstract void Transform(T item);
}

然后你可以得到每个类型:

public class Transformer1 : Tansformer<Template1>
{
    public void Transform(Template1 item) 
    {

    }
}

public class Transformer2 : Transformer<Template2>
{
    public void Transform(Template2 item)
    {

    }
}

然后您只需factory就可以找到正确的Transformer

public class TransformFactory
{
    public Transformer<T> GetTransformer<T>(T item)
    {
        if (item is Template1)
            return new Transformer1();
        else if (item is Template2)
            return new Transformer2();
        // ...
    }
}

这种方法的好处是,您可以在具体实现中将所有行为封装在该特定类型上。如果他们都有任何共同的行为,你可以在抽象基础上做到这一点。

答案 2 :(得分:0)

在C#

中调用基于参数而没有switch-case语句的方法

OOP 中,基于[打开 / 关闭 原则],它表示软件实体,例如类和函数应打开以进行扩展,但已关闭  修改。

使用 switch-case statement 的方法会对此原则提出质疑。为了在代码内部实现这个原则而没有  导致其功能发生变化。

我们使用名为&#34;委托字典模式&#34; 的模式。

例如,我们有一个名为Template的实体,用于保存输入值以及一些用于处理此模板的Transform类。

用于保持输入值的

模板

public class Template
{
    public int TransformNo { get; set; }
    public string Title { get; set; }
}

ITransform 转换抽象

的界面
public interface ITransform
{
    void Do(Template template);
}

Transform1 是ITransform的具体类

public class Transform1 : ITransform
{
    public void Do(Template template)
    {
        Console.WriteLine($"Transform : {template.TransformNo}, TemplateTitle : { template.Title}");
    }
}

Transform2 是ITransform的具体类

public class Transform2 : ITransform
{
    public void Do(Template template)
    {
        Console.WriteLine($"Transform : {template.TransformNo}, TemplateTitle : { template.Title}");
    }
}
用于协调* ITransformer **

模板的

TransformCordinator

public class TransformCordinator
{
    Dictionary<int, Action<Template>> transformMap = new Dictionary<int, Action<Template>>();
    public TransformCordinator()
    {
        transformMap.Add(1, x => new Transform1().Do(x));
        transformMap.Add(2, x => new Transform2().Do(x));
    }

    public void Do(Template template)
    {
        transformMap[template.TransformNo](template);
    }
}

//示例

 class Program
  {
    static void Main(string[] args)
    {

        var transformCordinator = new TransformCordinator();
        transformCordinator.Do(new Template() { TransformNo = 1, Title = "Hi!" });

        Console.ReadLine();
    }
}