重构:通用扩展方法

Lin*_*ela 2 c# generics extension-methods

我有一个扩展方法,检查对象的类型,然后填充其成员属性

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);
                }

            }
Run Code Online (Sandbox Code Playgroud)

我可以进一步重构这样的东西,使其更通用吗?

 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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

PS:我不想把对象的属性Meeting放在Base类(MyEntity)中

Ree*_*sey 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

除非您有一些提供Meeting属性的共享契约(基类或接口实现),否则您无法使用单个泛型方法执行此操作.

另一种方法是创建一个共享接口,即:IMeeting然后约束到:

public interface IMeeting
{
   public Meeting Meeting { get; set; }
   public int MeetingId { get; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

public static void LoadMeeting<T>(this T entity, IMeetingRepository meetingRepository) 
Run Code Online (Sandbox Code Playgroud)

其中T:IMeeting {if(entity!= null){entity.Meeting = meetingRepository.GetMeetingById(entity.MeetingId); }}

当您使用EF时,您可以在部分类中实现此接口:

public partial class Agenda : MyEntity, IMeeting
{
}
Run Code Online (Sandbox Code Playgroud)