我有一个程序,我想根据值创建对象的新实例,我取值然后搜索列表并使用该列表创建一个新实例。
嗯,它非常好。但是有一个问题,我必须手动编写它们并且需要很长时间。我想知道是否有更好的方法可以做到这一点,这里是我正在使用的C#代码
public Account (int userId) {
// here is look for the account
// inside a List<Account> which returns the account
// then I update the values for that instance,
this.AccountLockedSince = account.AccountLockedSince;
this.AuthenticationToken = account.AuthenticationToken;
this.CreateDate = account.CreateDate;
this.IsLocked = account.IsLocked;
this.IsVerified = account.IsVerified;
this.PasswordResetDate = account.PasswordResetDate;
this.PasswordResetToken = account.PasswordResetToken;
this.RequireEmailVerification = account.RequireEmailVerification;
this.TokenExpires = account.TokenExpires;
this.UserId = account.UserId;
}
..正如您所看到的,这些是Account类的所有属性,我已经更新了它们,但这不是执行此操作的有效方法。 C#.NET框架中的任何内置功能都可以处理这个问题吗?
答案 0 :(得分:3)
MemberwiseClone方法通过创建新对象,然后将当前对象的非静态字段复制到新对象来创建浅表副本。如果字段是值类型,则执行字段的逐位复制。如果字段是引用类型,则复制引用但不引用引用的对象;因此,原始对象及其克隆引用相同的对象。
如果您需要深层副本而非浅色副本,请尝试using serialization to create a deep copy。
您还可以使用Reflection获取和设置属性。请参阅Deep Copy using Reflection。
答案 1 :(得分:2)
MemberwiseClone很好,但我建议安装AutoMapper块包并开始使用它!它非常多才多艺,我在工作中经常使用它。
这个想法是,如果你想复制你所做的对象的属性
var shallowCopy = Mapper.DynamicMap<Account>(account);
好处是您可以事先定义类型之间的映射,如下所示:
Mapper.CreateMap<TypeA, TypeB>()
.ForMember(b => b.Tutu, opt => opt.MapFrom(a => a.Toto.Titi));
这样,当你从TypeA映射到TypeB时,TypeB的Totu属性将由TypeA中的Toto属性Titi填充。这些映射有很多选项可以处理您可能希望处理的所有情况;)
答案 2 :(得分:1)
我看到你想要自动更新你班级的属性 - 上面给出的答案可能没问题。但是,如果您只是想获得该类所有属性的名称,以下是最简单的方法,我想。
IEnumerable<string> properties = typeof(Account).GetProperties().Select(p => p.Name);