在无参数构造函数中设置属性

时间:2014-08-13 19:22:37

标签: c# linq parameters constructor

我正在使用linq通过无参数构造函数填充对象。我在构造函数上设置了一个断点,并注意到没有填充“this”的值。我想要的一个属性是其他一些属性的总和。以下是我班级的简要示例:

// I'd like totalEstimatedUse to be the total of estimatedType1 + estimatedType2
public class EstimatedUse
{
    public string ID { get; set; }
    public double estimatedType1 { get; set; }
    public double estimatedType2 { get; set; }
    public double totalEstimatedUse { get; set; } // I'd like this to be the sum
}

    // parameterless constructor - I cannot get anything to work inside this because
    // 'this' has no values when it's populated (from linq in my code)
    public EstimatedUse
    {
    }

    // here is a constructor that has parameters
    public EstimatedUse(string id, double estimatedType1, double estimatedType2)
    {
        this.ID = id;
        this.estimatedType1 = estimatedType1;
        this.estimatedType2 = estimatedType2;
        this.totalEstimatedUse = estimatedType1 + estimatedType2;
    }

发生的问题是我使用linq来填充它并且它转到无参数构造函数并且没有设置我的totalEstimatedUse。我正在做的解决方法是使用带有参数的构造函数再次设置它。是否有更合适的方法来实现这一点,而不是我在下面所做的那样?

EstimatedUse estimatedUse = null;

// cutoff linq to keep example clean
.Select(e => new EstimatedUse
{
    ID = e.ProjectID,
    estimatedType1 = e.estimatedType1),
    estimatedType1 = e.estimatedType2),
}).FirstOrDefault();

// below is to set the length but I wish I could set in the parameterless constuctor if    
// it's possible    
estimatedUse = new EstimatedUse(estimatedUse.ID, estimatedUse.estimatedType1,
                                stimatedUse.estimatedType2);

5 个答案:

答案 0 :(得分:2)

或许通过将totalEstimatedUse属性更改为自动对值进行求和的只读属性来提供更好的服务。

public class EstimatedUse
{
    public string ID { get; set; }
    public double estimatedType1 { get; set; }
    public double estimatedType2 { get; set; }

    public double totalEstimatedUse
    {
        get { return this.estimatedType1 + this.estimatedType2; }
    }

    // ...
}

这样您就不必在创建时设置属性的值,并且它将与其他值保持同步。

答案 1 :(得分:1)

您也可以更改totalEstimatedUse属性的getter,以便在访问时自动计算总和:

public class EstimatedUse
{
    public string ID { get; set; }
    public double estimatedType1 { get; set; }
    public double estimatedType2 { get; set; }
    public double totalEstimatedUse { get { return estimatedType1 + estimatedType2; }
}

答案 2 :(得分:0)

您没有在构造函数中设置值,而是使用了对象初始化程序语法。该语法通过调用其构造函数来创建对象,然后设置指定的属性。

要使用值执行对象的初始化,您需要实际拥有接受它们的构造函数。

当然,替代方案是首先避免需要初始化对象。在这种特殊情况下,这意味着不会在字段中保留总和,而是在属性获取器中根据请求计算总和。

答案 3 :(得分:0)

如果你不想在构造函数中传递任何参数,那么你应该将你应该传递给构造函数的字段设置为global。并在调用类之前设置值。然后在构造函数中,你可以初始化它。

虽然这不是理想的做法,但这仍然是一种选择。但您应该看看是否可以将参数传递给构造函数来设置值。

答案 4 :(得分:0)

只需消除无参数构造函数,并使用带参数的构造函数:

.Select(e => new EstimatedUse(e.ProjectID,e.estimatedType1e.estimatedType2))
.FirstOrDefault();

如果有更好的构造函数选项,则没有理由使用对象初始值设定项。