自定义/覆盖功能取决于参数/通用

时间:2017-10-27 15:24:54

标签: c# .net

我想通过在类中添加一个新函数来自定义外部类(自写)的功能,具体取决于函数参数/泛型类型。

例如,与此处http://automapper.readthedocs.io/en/latest/Custom-value-resolvers.html#custom-constructor-methods相同的是创建自定义界面并将其添加到对象中。

所以我想为类型T做一个自己的interace(例如class2) 并将此接口添加到class1,当我从class1调用一个函数时,应使用此接口/函数。

object1(of class1).add(Interface x, typeof(class2))
object1(of class1).DoSomething<class2>() -> calls interface/function x

与此处相同的功能:(但是在创建实例后不添加函数DoSomethingY,而是需要在class1本身中添加 - 我不想这样做)

public class class1 {

  private DoSomething1..
  private DoSomething2..
  private DoSomethingDefault..

  public T DoSomething<T>()
  {
     if(typeof(t) == ...)
       return DoSomething1();
     else(typeof(T) == ..)
       return DoSomething2();
     else
       return DoSometingDefault();
  }
}

所以我的问题。我用什么:交流,代表?我在哪里/如何存储?

修改 更清楚

public interface IDoSomething<T>
{
   public T Work(string obj)
}

public DoSomething1 : IDoSomething<class2>
{
  public class2 Work()
  {
     return new class2() {name = "xx"} {
  }
}

var obj1 = new class1();
obj1.Register<class2>(DoSomething1) // might be wrong syntax, but my intention
// or obj1.Register(tyopeof(class2),DoSomething1);

class2 obj2 = obj1.DoSomething<class2>();
//obj1/class1 should call DoSomething1.Work();

class3 obj3 = obj1.DoSomething<class3>(); // should call default if not registered

这是一个正常的设计模式吗?调用自定义函数而不是使用默认的类函数?

1 个答案:

答案 0 :(得分:1)

如果我理解你的话。你需要这样的东西:

var _do = new Do();

_do.Register<I1>(() => Console.WriteLine("I1 action"));
_do.Register<I2>(() => Console.WriteLine("I2 action"));

_do.Work<I1>();
_do.Work<I2>();
_do.Work<string>();

public class Do {
    IDictionary<Type, Action> actions = new Dictionary<Type, Action>();

    private void DefaultAction(){
        Console.WriteLine("Default action called");
    }

    public void Register<T>(Action act){
        var type = typeof(T);
        if(!actions.ContainsKey(type)){
            actions.Add(type, act);
        }
    }

    public void Work<T>() 
    {
        var type = typeof(T);
        if(actions.ContainsKey(type))
        {
            actions[type]();
        }
        else
        {
            DefaultAction();
        }
    }
}

public interface I1 { }

public interface I2 { }