是从MyObject []转换为Object []然后再次回到代码异味?

时间:2012-11-26 09:45:46

标签: c# refactoring

我正在审查/重构一些代码,我遇到了一个我不喜欢的相互依赖,但我不确定在C#中解决这个问题的最佳方法是什么。我的问题的实质是在一个文件中我有:

class MyObject
{
  public string Name {get;set;}
  public int? Age {get;set;}
}

public interface IConnection
{
  void Connect(string user,string pw,Action<MyObject[]> onConnect);
  void Disconnect();
}

然后在另一个文件中:

public class ConcreteDataProvider : IConnection
{
  public void Connect(string user,string pw,Action<MyObject[]> onConnect)
  {
    //...
    IEnumerable<MyObject> collection = ...
    onConnect( collection.ToArray() );
  }
}

我对此设计的问题是MyObject特定于此具体数据提供者。我不希望在IConnection中提到它。

我的想法是重构IConnection.Connect()看起来像:

void Connect(string user,string pw,Action<Object[]> onConnect);

然后在ConcreteDataProvider的{​​{1}}实现中,我将数组转换为onConnect。 (根据Unable to cast object of type 'System.Object[]' to 'MyObject[]', what gives?的外观,这意味着我需要使用MyObject[]

这是一个糟糕的设计会再次困扰我吗?


顺便说一句,对Array.ConvertAll的调用会触发数据下载,我不希望ToArray()调用直到完成。在幕后,它也触发了实际的连接;我不知道连接是否有效并且在第一次查询执行之前一直有效。这就是为什么我不想将onConnect()传递给IEnumerable,并让它调用OnConnect()

1 个答案:

答案 0 :(得分:4)

如何使用泛型?

public interface IConnection<T>
{
  void Connect(string user, string pw, Action<T[]> onConnect);
  void Disconnect();
}