Полиморфизм в типовых типах - PullRequest
1 голос
/ 01 января 2012

У меня есть общая структура, которая представляет динамическое значение, максимальное и минимальное значения и некоторые другие поля, структура увеличивает динамическое значение, пока не достигнет максимума, и уменьшится, пока не достигнет минимума, а затем циклически переключается назад и вперед. Проблема возникает, когда я хочу, чтобы эта структура представляла несколько числовых типов значений: double, uint, int32, float ..., а также сохраняла несколько структур в одном списке. Так что я получаю список экземпляров этой структуры, который заставляет меня выбирать тип структуры для всего списка, но я хочу, чтобы различные типы в одном списке. Как я могу реализовать такую ​​вещь? Я попытался использовать ограничения и сделать "где T: объект", но он говорит, что я не могу использовать класс Object в качестве ограничения ...

public struct eField<T> where T : struct
{
    private string _fieldName;
    private T _value;
    private T _minVal;
    private T _maxVal;
    private double _duration;
}

public class Device
{
    private List<eField> _fields;
}

Конечно, это приведет к ошибке, утверждающей, что eField должен получить параметр типа T>, опять же, я хочу, чтобы в списке было несколько типов структуры, а не только один тип для всего списка

Ответы [ 3 ]

4 голосов
/ 01 января 2012

Исходя из ваших примеров, похоже, что вы хотите использовать where T: struct, поэтому вы ограничиваетесь типами значений.

Редактировать

public interface IeField { }

public class eField<T> : IeField where T : struct
{
    private string _fieldName;
    private T _value;
    private T _minVal;
    private T _maxVal;
    private double _duration;
}

И использовать его.

List<IeField> fields;
fields.Add(new eField<int>());
fields.Add(new eField<uint>());
fields.Add(new eField<double>());

проверить этот пост C # - Несколько универсальных типов в одном списке

0 голосов
/ 02 января 2012

Вы можете обернуть доступ к списку некоторым мутатором и аксессором.

public Device addField<T>(eField<T> field) where T : struct {
   this.fieldList.add(field);

  return this;
}

Тогда список может быть List<Object>.Если вы приложите этот список должным образом, вы также обеспечите безопасность типов.

0 голосов
/ 02 января 2012

Ваша проблема заключается в том, что eField<int> и eField<float> не имеют общего типа предка (кроме объекта).Вам либо понадобится:

private List<object> _fields;

И этот список может содержать eField<int> или eField<float>, но может содержать и другие вещи.Или вы можете использовать базовый класс или интерфейс:

public interface IField { ... }
public struct eField<T> : IField {...}

В этом случае вы можете иметь List<IField>.Если методы в IField НЕ являются универсальными (void DoStuff ()), тогда вы можете написать код против него.Если у IField есть общие методы (это IField<T>), значит, вы снова в одной лодке.Но, вероятно, если вы пишете код для всех элементов в списке, между ними будет что-то общее.

...