2017-09-13 178 views
0

這是一個簡單的問題,但我不能在任何地方找到答案:嵌套屬性/在屬性嵌套對象

假設我有一個類:

public class ControlLoop 
{ 
    public double Setpoint { get; set; } 
    public double SetpointHighvalue { get; set; } 
    public double SetpointLowvalue { get; set; } 
} 

顯然,過去兩年屬性與第一個有關。我想重新編程類,這樣我可以啓動嵌套像這樣的屬性:

ControlLoop loop7a = new ControlLoop() 
{ 
    Setpoint = 7.1, 
    Setpoint.Highvalue = 20, 
    Setpoint.Lowvalue = -10, 
}; 

,並用它這樣的:

  loop7a.Setpoint = 7.1; 
     loop7a.Setpoint.Highvalue = 20; 
     loop7a.Setpoint.Lowvalue = -10; 

這在某種程度上可能嗎?

而且要更進一步,假設我有兩個類:

public class ControlLoop 
{ 
    public double Setpoint { get; set; } 
    public ValueRanges SetpointLimits { get; set; } = new ValueRanges(); 
} 

public class ValueRanges 
{ 
    public double Highvalue { get; set; } 
    public double Lowvalue { get; set; } 
} 

,我希望它使用它像這樣重新編程:

ControlLoop loop7a = new ControlLoop() 
{ 
    Setpoint = 7.1, 
    Setpoint.SetpointLimits.Highvalue = 20, 
    Setpoint.SetpointLimits.Lowvalue = -10, 
}; 

它這個可能,如何?

更新:我在這裏制定了@tetralobita的建議。它提供了理想的結果,但認爲是是有點「overprogrammed」:

class Program 
{ 
    static void Main(string[] args) 
    { 

     ControlLoop loop7a = new ControlLoop() 
     { 
      Setpoint = new DoubleX(3.4) 
      { 
       PointLimits = new ValueRanges() 
       { 
        Highvalue = 30, 
        Lowvalue = -40, 
       }, 
      }, 
      State = new IntX(1) 
      { 
       PointLimits = new ValueRanges() 
       { 
        Highvalue = 0, 
        Lowvalue = 8, 
       }, 
      }, 

     }; 
     loop7a.Setpoint = 7.1; 
     loop7a.Setpoint.Value = 7.1; 
     loop7a.Setpoint.PointLimits.Highvalue = 20; 
     loop7a.Setpoint.PointLimits.Lowvalue = -10; 
     loop7a.State = 2; 
     loop7a.State.PointLimits.Lowvalue = 0; 
     loop7a.State.PointLimits.Highvalue = 10; 


    } 
} 
public class ControlLoop 
{ 
    public DoubleX Setpoint { get; set; } 
    public IntX State { get; set; } 
} 

public class ValueRanges 
{ 
    public Double Highvalue { get; set; } 
    public Double Lowvalue { get; set; } 

} 


public class VariableX 
{ 

    public ValueRanges PointLimits { get; set; } = new ValueRanges() 
    { 
     Highvalue = 1, 
     Lowvalue = -1, 
    }; 



} 
public class DoubleX : VariableX 
{ 
    public DoubleX(double d) 
    { 
     Value = d; 
    } 

    public Double Value { get; set; } 

    public static implicit operator DoubleX(double v) 
    { 
     return new DoubleX(v); 
    } 


} 
public class IntX : VariableX 
{ 
    public IntX(int d) 
    { 
     Value = d; 
    } 

    public int Value { get; set; } 

    public static implicit operator IntX(int v) 
    { 
     return new IntX(v); 
    } 


} 
+2

您是否嘗試過使用一個結構? –

+0

如果您正確構造類型,您可以執行'Setpoint = {Highvalue = 20,Lowvalue = -10}'。 –

回答

1

是的,你可以通過重載implicit運營商做

這是爲double號碼

class Digit { 
    public Digit(double d) { 
     Val = d; 
    } 

    public double Val; 

    public static implicit operator double(Digit d) { 
     return d.Val; 
    } 

    public static implicit operator Digit(double d) { 
     return new Digit(d); 
    } 

} 

現在你可以做到這一點Digit d = 12; 當你做到這一點,類創建新Digit和您的值賦給Val

MSDN鏈接被here

3

你提出的語法爲ControlLoop(loop7a)是在C#中可能的,但感覺不對。

試試這個:

public class SetPoint { 
    public double Value {get;set;} 
    public double High {get;set;} 
    public double Low {get;set;} 
} 

public class ControlLoop { 
    public SetPoint SetPoint {get;set;} 
} 

,並創建一個實例:

ControlPoint loop7a = new ControlPoint() { 
    SetPoint = new SetPoint() { 
     Value = 1.0, 
     High = 9.0, 
     Low = 0.32 
    } 
} 
+0

你是對的,它感覺不對,但在99%的時間內,使用設定點類的程序員他只想訪問value屬性。所以controlloop7.Setpoint = 10.3。在這個問題的更新中,我提出了@tetralobita的建議,它提供了期望的結果,但編碼非常糟糕。我必須自己決定是使用這個建議還是讓它像controlloop7.Setpoint.Value = 10.3 –

1
ControlLoop loop7a = new ControlLoop() 
{ 
    Setpoint = 7.1, 
    Setpoint.Highvalue = 20, 
    Setpoint.Lowvalue = -10, 
}; 

Setpointdouble。雙打沒有HighvalueLowvalue屬性。這使訪問Setpoint.HighvalueSetpoint.Lowvalue不可能。

Setpoint.SetpointLimits.Highvalue也是如此,因爲雙打沒有SetpointLimits屬性。

你可以做的是這樣的:

ControlLoop loop7a = new ControlLoop() 
{ 
    Setpoint = new Setpoint(7.1) 
    { 
     Highvalue = 20, 
     Lowvalue = -10, 
    }, 
}; 

如果這是可以接受的你,這是它可能是什麼樣子:

public struct Setpoint 
{ 
    public double Value { get; set; } 
    public double Highvalue { get; set; } 
    public double Lowvalue { get; set; } 

    public Setpoint(double value) 
    { 
     Value = value; 
     Highvalue = 0; 
     Lowvalue = 0; 
    } 
} 

public class ControlLoop 
{ 
    public Setpoint Setpoint { get; set; } 
} 
+0

'double'是'System.Double'的別名,因此它是一個對象。理論上講,從Double引出一個'DoubleX'類是很好的,不幸的是'System.Double'是封閉的。 –

+0

即使您可以繼承'double',double * literal *仍然是double類型,而不是您的CustomDouble類型。所以你將永遠必須實例化該類型,無論它是否來自'double'。 – poke