我有一个扩展方法来检查对象的类型,然后填充它的成员属性
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);
}
}
}
PS:我不想把对象的属性Meeting
放在基类(MyEntity)
最佳答案
就我个人而言,我只会使用重载:
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
属性的共享协定(实现的基类或接口(interface)),否则您无法使用单个泛型方法来完成此操作。
另一种方法是制作一个共享界面,即: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 { 如果(实体!= null) { entity.Meeting = meetingRepository.GetMeetingById(entity.MeetingId); }
当您使用 EF 时,您可以在分部类中实现此接口(interface):
public partial class Agenda : MyEntity, IMeeting
{
}
关于c# - 重构这个 : Generic extension method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19671507/