Subsonic Add或Update方法转换为Generic Method

时间:2010-09-10 11:27:56

标签: generics c#-4.0 subsonic3

所以我有这两种方法

private static void AddOrUpdate(Computer input)
{
    if (Simple.Repository.Exists<Computer>(o => o.ObjectSid == input.ObjectSid))
    {
        Simple.Repository.Update(input);
    }
    else
    {
        Simple.Repository.Add(input);
    }
}

private static void AddOrUpdate(User input)
{
    if (Simple.Repository.Exists<User>(o => o.ObjectSid == input.ObjectSid))
    {
        Simple.Repository.Update(input);
    }
    else
    {
        Simple.Repository.Add(input);
    }
}

作为练习,我想知道我是否可以使用通用方法,只需将方法更改为

private static void AddOrUpdate<T>(T input)
    {
        if (Simple.Repository.Exists<T>(o => o.ObjectSid == input.ObjectSid))
        {
            Simple.Repository.Update(input);
        }
        else
        {
            Simple.Repository.Add(input);
        }
    }

不起作用 - 编译器说类型T必须是引用类型。

有可能吗?甚至可取?有更好的重构吗?

    public class User
    {
        private string _samAccountName;

        [DisplayName("User Name")]
        public string SamAccountName 
        {
            get { return _samAccountName ?? "No User"; }
            set { _samAccountName = value; } 
        }

        public string UserPrincipalName { get; set; }
        public string DisplayName { get; set; }
        public DateTime LastLogonTimeStamp { get; set; }
        [SubSonicPrimaryKey] public Guid ObjectSid { get; set; }
        public Guid? ComputerGuid { get; set; }
    }

and

    public class Computer
    {
        public string DistinguishedName { get; set;}
        public string DnsHostname { get; set; }
        public string Description { get; set; }
        public string Cn { get; set; }
        public DateTime LastLogonTimeStamp { get; set; }
        public String OperatingSystem { get; set; }
        public string OperatingSystemServicePack { get; set; }
        [SubSonicPrimaryKey] public Guid ObjectSid { get; set;}
        public Guid? UserGuid { get; set; }
    }

2 个答案:

答案 0 :(得分:0)

如果计算机和用户从定义public Guid ObjectSid的基类继承,那么您可以将通用方法定义为

private static void AddOrUpdate<T>(T input) where T : BaseClass, new()
{
    if (Simple.Repository.Exists<T>(o => o.ObjectSid == input.ObjectSid))
    {
        Simple.Repository.Update(input);
    }
    else
    {
        Simple.Repository.Add(input);
    }
}

然后离开。

答案 1 :(得分:0)

我们通过使所有SubSonic生成的类实现一个接口来完成此任务:

public interface IPersistable {
  bool IsPersisted { get; }
}

IsPersisted的实现检查主键字段是否等于该类型的默认值。然后,我们在Save of of off上启动Add或Update决定。这让我们避免查询数据库以查看id是否存在。