Общее свойство - как указать тип во время выполнения - PullRequest
2 голосов
/ 20 мая 2010

Я читал вопрос о создании общего свойства , но меня немного смущает последний пример первого ответа (я включил соответствующий код ниже ):

Вы должны знать тип при компиляции время. Если вы не знаете тип в время компиляции, то вы должны хранить это в объекте, в этом случае вы можете добавить следующее свойство в Foo Класс:

public object ConvertedValue {
    get {
        return Convert.ChangeType(Value, Type);
    }
}

Это кажется странным: оно преобразует значение в указанный тип, но возвращает его как объект, когда значение было сохранено как объект. Разве возвращенный объект еще не требует распаковки? Если это так, то зачем беспокоиться о преобразовании типа?

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

public class Foo
{
    object Value {get;set;}
    Type ValType{get;set;}
    Foo(object value, Type type)
    { Value = value; ValType = type; }

    // I need a property that is actually
    // returned as the specified value type...
    public object ConvertedValue {
        get {
            return Convert.ChangeType(Value, ValType);
        }
    }
}

Можно ли сделать общее свойство? Требуется ли для возвращаемого свойства все еще распаковка после получения доступа?

Примечание: я не хочу делать Foo универсальным, потому что я хочу, чтобы Foo содержал значения разных типов, и я хочу поместить различные Foo в коллекцию. Другими словами, я хочу иметь коллекцию, которая содержит различные типы объектов.

1 Ответ

2 голосов
/ 20 мая 2010

Convert.ChangeType() определяет тип во время выполнения. Заданный вами параметр может быть рассчитан во время выполнения и может быть тем, чего компилятор не может знать при компиляции.

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

Он по-прежнему преобразует тип - например, из int в double. Тип времени компиляции object, но тип времени выполнения изменяется. Если вы запустите GetType() для этого объекта, вы получите фактический тип времени выполнения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...