C#使用Intellisense支持创建动态对象的方法

时间:2014-06-20 05:09:51

标签: c# reflection intellisense factory-pattern dynamicobject

我有一个使用C#的客户端/服务器应用程序。

在我的设计中,客户端将通过C#类和方法向服务器请求服务器支持的一些数据过滤和收集。

我有一个服务器连接接收请求并将数据提供给客户端。为此,客户端请求对象,方法和参数。

因此,客户端会执行以下请求:

GetData (MyClass, MyMethod, MyParams[]);

一切正常我在服务器上使用当前的动态方法调用:

        Type type = System.Type.GetType(MyClass);
        object instance = System.Activator.CreateInstance(type);
        MethodInfo method = type.GetMethod(MyMethod);
        object[] parameters = new object[] { MyParams[] };
        var data = method.Invoke(instance, parameters); 

        ... data checking, filtering and returning to client...

我有一个问题,我有几个不同的对象和方法,每个都有不同的检查和过滤。由于动态对象不支持Intellisense,我检查数据后的代码是一个大混乱,难以支持甚至理解。

我希望有一种不同的方法,我可以使用Intellisense支持(已知类型)获取数据。这将使我的生活更轻松,代码更清晰。另一方面,我不打算使用不同的组合构建十几个GetData调用。

我想构建一个对象工厂,但我不确定哪种模式最适合这里。我确定这里有一个很好的模式,但是我看不出解决问题的方法......

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果没有更多详细信息,很难确定问题的复杂性,但我认为您正在寻找策略模式

Runnable example

abstract class Strategy
  {
    public abstract void AlgorithmInterface();
  }

class ConcreteStrategyA : Strategy
  {
    public override void AlgorithmInterface()
    {
      Console.WriteLine(
        "Called ConcreteStrategyA.AlgorithmInterface()");
    }
  }

class ConcreteStrategyB : Strategy
  {
    public override void AlgorithmInterface()
    {
      Console.WriteLine(
        "Called ConcreteStrategyB.AlgorithmInterface()");
    }
  }

class Context
  {
    private Strategy _strategy;

    // Constructor
    public Context(Strategy strategy)
    {
      this._strategy = strategy;
    }

    public void ContextInterface()
    {
      _strategy.AlgorithmInterface();
    }
  }

class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
        static void Main()
        {
          Context context;

          // Two contexts following different strategies
          context = new Context(new ConcreteStrategyA());
          context.ContextInterface();

          context = new Context(new ConcreteStrategyB());
          context.ContextInterface();

          // Wait for user
          Console.ReadKey();
        }
      }

来自Design Patterns: Elements of Reusable Object-Oriented Software

<强>策略

  

定义一系列算法,封装每个算法,并制作   他们可以互换。策略允许算法独立变化   来自使用它的客户。

<强>适用性

在以下情况下使用策略模式:

  1. 许多相关类只在行为上有所不同。策略提供了一个 使用多种行为之一配置类的方法。

  2. 您需要不同的算法变体。例如,你可能 定义反映不同空间/时间权衡的算法。策略 可以在将这些变体实现为类层次结构时使用 算法

  3. 算法使用客户端不应该知道的数据。使用策略 模式,以避免暴露复杂的,特定于算法的数据结构。