c# - 重构这个 : Generic extension method

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

            }

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

 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/

相关文章:

java - ClassCastException 与带有泛型的 java 列表迭代器

c# - 我可以为我不直接控制的两个类添加隐式转换吗?

c# - 如果找不到元素,为什么 Selenium 会给出超时异常?

c# - Facebook 的 OAuthWebSecurity 未按预期使用电子邮件权限

c# - 当用户单击控制台窗口时,代码停止执行

swift - 从 Swift 中的嵌套泛型获取所有类型

java - <S extends CharSequence> S 的返回类型是什么意思?

c# - 完整数据集而不是 Top 1000 EF Core

swift - 在 Swift 字典扩展中检查 nil 值

c# - 我的扩展方法没有注册