Создание общего свойства - PullRequest
64 голосов
/ 07 ноября 2008

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

public String Value { get; set; }

public Type TheType { get; set; }

public typeof(TheType) CastedValue { get { return Convert.ChangeType(Value, typeof(_Type)); }

Возможно ли это в C #?

Ответы [ 3 ]

99 голосов
/ 07 ноября 2008

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

class Foo<TValue> {
    public string Value { get; set; }
    public TValue TypedValue {
        get {
            return (TValue)Convert.ChangeType(Value, typeof(TValue));
        }
    }
}

Вместо этого можно использовать универсальный метод:

class Foo {
    public string Value { get; set; }
    public Type TheType { get; set; }

    public T CastValue<T>() {
         return (T)Convert.ChangeType(Value, typeof(T));
    }
}

Вы также можете использовать классы System.ComponentModel.TypeConverter для преобразования, поскольку они позволяют классу определять собственный конвертер.

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

Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);

int c = foo.CastValue<int>();

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

public object ConvertedValue {
    get {
        return Convert.ChangeType(Value, Type);
    }
}
54 голосов
/ 07 ноября 2008

Свойства, события, конструкторы и т. Д. Не могут быть общими - только методы и типы могут быть общими. В большинстве случаев это не проблема, но я согласен, что иногда это боль. Ответ Браннона дает два разумных обходных пути.

3 голосов
/ 07 ноября 2008

Я не верю, что приведенный здесь пример возможен. Тип CastedValue должен быть определен во время компиляции, что означает, что он не может зависеть от значения времени выполнения (значения свойства TheType).

РЕДАКТИРОВАТЬ: решение Брэннона имеет несколько хороших идей о том, как справиться с этим, используя обобщенную функцию, а не свойство.

...