Как создать и установить полиморфное свойство?

Я хочу создать класс, который может принимать различные типы значений в свойствах. Я пытаюсь сделать это с помощью полиморфизма, но я еще не научился делать это правильно, поэтому прошу совета.

У меня есть базовый класс и два класса, которые от него наследуются.:

public abstract class BaseClass
{
    public string Name { get; set; }
    public Unit Unit { get; set; }
}

public class DerivedClassFloat : BaseClass
{
    public float Value { get; set; }

    public override string ToString()
    {
        return Value.ToString();
    }
}

public class DerivedClassString : BaseClass
{
    public string Value { get; set; }

    public override string ToString()
    {
        return Value;
    }
}

Все хорошо, я могу создать список и добавить разные специализированные подклассы. Моя проблема возникает, когда мне нужно изменить значения элементов в моем списке.:

foreach (var item in ListOfBaseClasses)
{
   if(item is DerivedClassFloat)
     ((DerivedClassFloat) item).Value = float.NaN;
   if (item is DerivedClassString)
      ((DerivedClassString) item).Value = string.Empty;
}

Согласно тому, что я прочитал, это выглядит как запах кода. Есть ли лучший способ получить доступ к свойству value моих производных классов на основе типа, который я пытаюсь присвоить?

А если вы хотите создать правильный подкласс на основе значения?

BaseClass newClass = null;
if (phenotype is DerivedClassFloat)
    newClass = new DerivedClassFloat(){Value = 12.2};
if (phenotype is DerivedClassString)
    newClass = new DerivedClassString(){Value = "Hello"};                      

Я читал о переопределении виртуальных методов, но это работает, если я хочу обработать значение, а не добавить или изменить его… может быть, я что-то упускаю?


Я должен сделать это более конкретным, мои извинения, я не привык публиковать вопросы на этом замечательном сайте.

Мне нужно свойство, состоящее из списка атрибутов.У каждого атрибута есть имя и значение, но значение может быть разных типов. Например:

public class Organism
{
    public string Name { get; set; }
    public List<Attribute> Attributes { get; set; }
}

public class Attribute
{
    public string AttributeName { get; set; }
    public object AttributeValue { get; set; }
}

Для данного организма я могу иметь несколько атрибутов, содержащих разные типы значений. Я хотел избежать использования типа объекта, чтобы мне не приходилось приводить к правильному типу. Я думал, что полиморфизм свойств был решением для элегантного решения этого случая, но потом я обнаружил, что использую If..Then, что, во-первых, не слишком отличается от приведения типов.

7
задан demongolem 16 July 2014 в 20:18
поделиться