2012-05-03 81 views
0

我有一些在我的项目具有将包含匹配值时,他们正在初始化领域对象 - 请参阅下面的示例代码片段,在 特别是AddedDateTimeModifiedDateTime性质:避免重复对象初始值

User user = new User() 
{ 
    FirstName = "Tex", 
    Surname = "Murphy", 
    AddedDateTime = DateTime.Now, 
    ModifiedDateTime = DateTime.Now 
}; 

是否有可能一旦被设置为ModifiedDateTime值设置为AddedDateTime值时,{...}块之内?

我有一种感觉这是不可能的,但认为它值得要求确认。

+1

你为什么不尝试,让我们知道? – banging

+1

如果您执行'ModifiedDateTime = AddedDateTime',会发生什么? – mattytommo

+0

如果你愿意,你也可以尝试'AddedDateTime = ModifiedDateTime = DateTime.Now'。 – banging

回答

1

我不确定这是不是你之后的事,但这是否合适?

var now = DateTime.Now; 
User user = new User 
{ 
    FirstName = "Tex", 
    Surname = "Murphy", 
    AddedDateTime = now, 
    ModifiedDateTime = now 
}; 

如果你想拥有它们初始化为相同的值,那么你必须设置一个公共变量的值。

+0

根据回复(谢谢大家),这似乎是唯一可行的选择 - 不是我希望的答案,而是下一个最好的选择。我认为这可能是这种情况。真正令人遗憾的是,.Net对象初始化器不允许你获取已经在同一个初始化块中设置的属性的值。谢谢@Reddog – Bern

0
User user = new User 
      { 
       FirstName = "Tex", 
       Surname = "Murphy", 
       AddedDateTime = DateTime.Now < Something? DateTime.Now : SomeOtherValue, 
       ModifiedDateTime = DateTime.Now < Something? DateTime.Now : SomeOtherValue 
      }; 
+0

不是我想要的。我想设置AddedDateTime,然后将ModifiedDateTime设置为AddedDateTime。这就是如果它是可能的。 – Bern

0

正如在评论中提到,你可以把包含了你所需要的数据,即:

public User(string firstName, string sirname) 
{ 
    FirstName = firstName, 
    Surname = sirname, 
    AddedDateTime = DateTime.Now, 
    ModifiedDateTime = DateTime.Now 
}; 

你也可以有辅助的方法来创建类的实例构造函数。他们可能是类的内部或不

public static User CreateUser(string firstName, string sirname) 
{ 
    User newUser = new User(); 
    newUser.FirstName = firstName, 
    newUser.Surname = sirname, 
    newUser.AddedDateTime = DateTime.Now, 
    newUser.ModifiedDateTime = DateTime.Now 

    return newUser; 
}; 

你也可以有这样的事情(如果你无法控制的类本身,这是很有用):

public static User CreateUser(string firstName, string sirname, string otherdata) 
{ 
    User newUser = new User(); 
    newUser.FirstName = firstName, 
    newUser.Surname = sirname, 
    newUser.AddedDateTime = DateTime.Now, 
    newUser.ModifiedDateTime = DateTime.Now, 
    newUser.SomeField = otherdata, 
    newUser.SomeOtherField = otherdata 

    return newUser; 
}; 
+0

我的目标是尽可能缩短代码,并避免调用DateTime.Now两次,理想情况下我希望它的值在初始化时反映在ModifiedDateTime中。对不起,您的上述建议表示赞赏,但不解决问题。 – Bern

+0

他们如何解决这个问题?使用前两种方法,您不需要一次输入'DateTime.Now',更不用说两次了。第三个代码片段涵盖了在每个创建对象中都有一些不常见的数据的一般情况,但是它被设置为两个(或更多)属性。如果这不能解决你确切的问题,那么你可能需要提供一个你想要的成品能够做到的例子。 – Servy

+0

在回答你的第一个问题时,你的回答并没有解决我提出的最初问题,那就是避免访问DateTime.Now属性两次。 – Bern

0

你可以把逻辑进入您的AddedDateTime的设置器检查ModifiedDateTime上的最小值并进行相应设置。例如

public DateTime ModifiedDateTime { get; set; } 
private DateTime _addedDateTime; 
public DateTime AddedDateTime { 
    get { return _addedDateTime; } 
    set 
    { 
     if (ModifiedDateTime == DateTime.MinValue) 
     { 
      ModifiedDateTime = _addedDateTime = value; 
     }; 
    } 
} 

... 

var test = new Test 
{ 
    AddedDateTime = DateTime.Now 
}; 
1

也许你可以把这个逻辑到性能的实现:

public class User{ 
    private DateTime added; 
    private DateTime? modified; 

    string FirstName {get;set;} 
    string SurName {get;set;} 

    DateTime AddedDateTime { 
    get { return added; } 
    set { added = value; 
     modified = modified ?? value; 
     } 
    } 

    DateTime? ModifiedDateTime { 
    get { return modified } 
    set { modified = value; } 
    } 
}