2

オブジェクトの型をチェックし、そのメンバー プロパティを設定する拡張メソッドがあります。

public static void LoadMeeting<T>(this T entity, IMeetingRepository meetingRepository) 
where T: MyEntity
            {
                var agenda = entity as Agenda;

                if (agenda != null)
                {
                    agenda.Meeting = meetingRepository.GetMeetingById(agenda.MeetingId);
                }

                var participant = entity as Participant;

                if (participant != null)
                {
                    participant.Meeting = meetingRepository.GetMeetingById(participant.MeetingId);
                }

            }

それをさらに一般的なものにするために、このようなものにさらにリファクタリングできますか?

 public static void LoadMeeting<T>(this T entity, IMeetingRepository meetingRepository) where T : MyEntity
        {
            var obj = entity as Agenda || entity as Participant;

            if (obj != null)
            {
                obj.Meeting = meetingRepository.GetMeetingById(obj.MeetingId);
            }
        }
    }

MeetingPS: オブジェクトのプロパティを Base クラス (MyEntity)に入れたくありません

4

2 に答える 2

6

個人的には、オーバーロードを使用します。

public static void LoadMeeting(this Agenda agenda, IMeetingRepository meetingRepository) 
{
    if (agenda != null)
    {
         agenda.Meeting = meetingRepository.GetMeetingById(agenda.MeetingId);
    }
}
public static void LoadMeeting(this Participant participant, IMeetingRepository meetingRepository) 
{
    if (participant != null)
    {
        participant.Meeting = meetingRepository.GetMeetingById(participant.MeetingId);
    }
}

Meetingプロパティを提供する共有コントラクト (実装された基本クラスまたはインターフェイス) がない限り、単一のジェネリック メソッドでそれを行うことはできません。

別の方法は、共有インターフェイスを作成することです。つまり: IMeeting、次にそれに制限します:

public interface IMeeting
{
   public Meeting Meeting { get; set; }
   public int MeetingId { get; }
}

次に、次のように記述できます。

public static void LoadMeeting<T>(this T entity, IMeetingRepository meetingRepository) 

ここで、T: IMeeting { if (entity != null) { entity.Meeting = meetingRepository.GetMeetingById(entity.MeetingId); } }

EF を使用しているため、このインターフェイスを部分クラスに実装できます。

public partial class Agenda : MyEntity, IMeeting
{
}
于 2013-10-30T00:13:39.557 に答える
1

クラスを処理する必要があり、それが基本クラスである場合に備えて、メソッドから早期に戻ることができます。

public static void LoadMeeting<T>(this T entity, IMeetingRepository meetingRepository) where T: MyEntity
        {
            var agenda = entity as Agenda;

            if (agenda != null)
            {
                agenda.Meeting = meetingRepository.GetMeetingById(agenda.MeetingId);
                return;
            }

            var participant = entity as Participant;

            if (participant != null)
            {
                participant.Meeting = meetingRepository.GetMeetingById(participant.MeetingId);
                return;
            }
        }

テーブル アプローチを検討することもできます。

    public static void LoadMeeting<T>(this T entity, IMeetingRepository meetingRepository) where T: MyEntity {
        var name = entity.GetType().Name;
        if (Table.ContainsKey(name)) {
            Table[name](entity, meetingRepository);
            }
        }

テーブルの場所:

static Dictionary<String, Action<MyEntity, IMeetingRepository>> Table = new Dictionary<String, Action<MyEntity, IMeetingRepository>>();

そして、次のように初期化されます。

        Table.Add("Agenda", (agenda, meetingRepository) => { 
            ((Agenda)agenda).Meeting = meetingRepository.GetMeetingById(((Agenda)agenda).MeetingId); }); 
        Table.Add("Participant", (participant, meetingRepository) => { 
            ((Participant)participant).Meeting = meetingRepository.GetMeetingById(((Participant)participant).MeetingId); }); 

明らかに、テーブルは静的で、拡張メソッドで使用できる必要があります (たとえば、含まれているクラスで)。

于 2013-10-30T01:10:27.657 に答える