Определите переменную с подпеременной (или со свойством)

Цель состоит в том, чтобы иметь переменную со свойством Unit, к которой можно было бы получить доступ, например:

Params MyParams;    

MyParams.Diae = 100.0;
MyParams.Diae.Unit = "kg";

В идеале переменная Diae является членом класса Params и должна наследовать свойство Unit от класса IParameter:

internal class IParameter
{
    string unit;
    internal string Unit { get; set; }

    internal IParameter()
    {
        unit = "";
    }

}

Как объявить переменную Diae? Вот фрагмент квазикода ожидаемой декларации:

namespace SomeCode
{
    internal class Params
    {
        double diae;

        internal class Diae:IParameter
        {
            get { return diae; }
            set { diae = value; }
        }
    }
}

person Jan    schedule 06.05.2013    source источник
comment
Я не понимаю, что именно вы хотите? Класс, содержащий double Value и string Unit? Какова ваша конечная цель?   -  person ppetrov    schedule 06.05.2013
comment
Это добавило бы сложности (вам потребуется два класса) без какой-либо заметной выгоды.   -  person Steve Wellens    schedule 06.05.2013
comment
Переменная, объявленная как объект String, может иметь значение. И можно получить доступ к длине переменной, добавив .Length к переменной. Я ориентировался на что-то подобное. Обращение к значению переменной происходит чаще, чем к ее единице, поэтому нужная реализация   -  person Jan    schedule 06.05.2013


Ответы (2)


Вы не можете делать именно то, что хотите — вы не можете добавлять дополнительные свойства к существующему типу, такому как double, поэтому вам придется заставить Diae возвращать отдельный класс. Что-то вроде этого:

internal class ParamWithUnit
{
  public string Unit { get; set; }
  public double Value { get; set; }
}

internal class Params
{
  private ParamWithUnit diae = new ParamWithUnit();

  public ParamWithUnit Diae 
  {
    get { return this.diae; }
  }
}

Затем вы можете сделать:

Params MyParams = new Params();    

MyParams.Diae.Value = 100.0;
MyParams.Diae.Unit = "kg";
person Jeremy Todd    schedule 06.05.2013

Вы не сможете [захотеть] назначить двойник Diae, но при этом разрешить ему иметь свойство Unit. (Вы можете обойти это с помощью неявных преобразований или чего-то подобного, но я бы отговаривал вас от этого.)

Лучшим вариантом было бы создать класс, такой как Measurement, который будет иметь как свойство Value, так и свойство Unit:

public class Measurement
{
    public double Value {get;set;}
    public string Unit {get;set;}
}

Тогда Diae может быть такого типа:

internal class Params
{
    public Measurement Diae {get;private set}
    public Params()
    {
        Diae = new Measurement();
    }
}

Теперь вы можете сделать:

Params MyParams = new Params();    

MyParams.Diae.Value = 100.0;
MyParams.Diae.Unit = "kg";
person Servy    schedule 06.05.2013
comment
Как насчет расширения встроенного объекта Double. Будет ли это чисто? - person Jan; 06.05.2013
comment
@ Jansk83 Jansk83 Как я уже сказал в своем ответе, это возможно, но нежелательно. - person Servy; 06.05.2013