1

私はこの方法を持っていますが、それが私が抱えている別の問題の原因であると確信しています. これは、このメソッドがobject実際に返す 3 つの具体的な型の 1 つではなく、型を返すためだと思います。

メソッドは次のとおりです。

public object GetData(TableType type)
{
    switch (type)
    {
        case TableType.Person:
            return new Domain.PersonList(_personRepository.Get());
        case TableType.Event:
            return new Domain.EventList(_eventRepository.Get());
        case TableType.User:
            return new Domain.UserList(_userRepository.Get());
    }

    return null;
}

以外の型を返すようにこのメソッドを変更するにはどうすればよいobjectですか?

4

6 に答える 6

2

必要なのはジェネリックです。このようにして、メソッドは に従って型を返しtypeます。

たとえば、このメソッドは次のTServiceタイプを返します。

private TService GetService<TService>(ServiceInfo serviceInfo)
    where TService : class, ICoordinationExecutionService
{
    var service = _executionServices.FirstOrDefault(
            x => x.ServiceInfo.InstanceInfo.InstanceId == serviceInfo.InstanceInfo.InstanceId
                && serviceInfo.ServiceTypeName.Equals(x.ServiceInfo.ServiceTypeName));

    if (service == null)
    {
        throw new Exception("invalid service ");
    }

    return _directory.GetService<TService>(service.ServiceInfo);
}
于 2013-10-21T19:46:55.997 に答える
1

まず、3 種類のリポジトリの「最小公分母」ベース クラスを特定する必要があります。持っていない場合は、作成する必要があります。これを行う1つの方法は

public abstract class repositoryBase
{
   public virtual IList<repositoryBase> Get() { }
}

次に、3 つのクラスのそれぞれが、repositoryBase から継承します。

public personRepository : repositoryBase
{
   public override IList<personRepository> Get()
   {
      // code here to return the list
   }
}

この方法でクラス階層をリファクタリングすると、GetData メソッドも必要なくなります。GetData を呼び出していた場所で、someRepository.Get(); を呼び出すだけです。

既に何か他のものから継承しており、基本クラスに Get メソッドを追加するのが適切でない場合は、インターフェイスを使用して、ここで説明したのと同じことを行うことができます。この場合、基本クラスまたはインターフェイスのいずれかのアプローチが同様に機能し、どちらも優れた OO プラクティスです。

于 2013-10-21T19:50:16.637 に答える
1

もう 1 つの可能性は、Interfaces を使用して、3 つの型のうち 1 つだけが返されることを保証することです。

public IDomainList GetData(TableType type)
{
    switch (type)
    {
        case TableType.Person:
            return new Domain.PersonList(_personRepository.Get());
        case TableType.Event:
            return new Domain.EventList(_eventRepository.Get());
        case TableType.User:
            return new Domain.UserList(_userRepository.Get());
    }

    return null;
}

PersonListEventList、およびUserListすべてが IDomainList インターフェイスを実装している限り、これら 3 つのタイプのいずれかを返すことが保証されます。次に、実装で、返された特定の型に基づいて何をすべきかを決定できます。

于 2013-10-21T19:51:14.777 に答える
0

GetData型をパラメーターとして取得し、正しい型を返す3 つの関数を作成できます。

public List<TableType.Person> GetData(TableType.Person type)
{
    return new Domain.PersonList(_personRepository.Get());
}

public List<TableType.Event> GetData(TableType.Event type)
{
     return new Domain.EventList(_eventRepository.Get());
}

public List<TableType.User> GetData(TableType.User type)
{
     return new Domain.UserList(_userRepository.Get());
}

ランタイムは、パラメーターの型に応じて正しいオーバーロードを選択します。

編集:この例では、 Domain.xxxxList 関数が前述のタイプのリストを返すと想定しています。もちろん必須ではありません。

于 2013-10-21T19:49:31.800 に答える