2012-02-18 2 views
1

Как назначить значение в классе общих классов C#?Как назначить члены общего типа в конструкторе общего типа?

public class GeneralWrapper<T> 
{ 
    public GeneralWrapper() 
    { 
     Datas = new ? 
    } 

    public T Datas { get; set; } 
} 

Я пишу общий класс обертки для объектов List (любой объект). Так что я могу использовать этот класс как

GeneralWrapper<List<string>> _wrapper = new GeneralWrapper<List<string>>(); 
_wrapper.Datas.Add("hello") 

но Datas должны быть автоматически инициализируются в конструкторе, как

Datas = new Datas<t>(); 

, кажется, так что я не должен создавать новый после того как я создать GeneralWrapper класс.

ответ

5

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

public class GeneralWrapper<T> where T: new() 
{ 
    public GeneralWrapper() 
    { 
     Datas = new T(); 
    } 

    public T Datas { get; set; } 
} 

new() ограничение указывает на то, что T должен быть типом, который обладают по умолчанию, конструктор без параметров. Это проверяется во время компиляции и позволяет вам создать экземпляр этого объекта из универсального класса.

2

Возможность создания экземпляров параметров типового типа в C# довольно ограничена. По умолчанию вы действительно только есть несколько вариантов

  • Constrain T к new() который позволяет new T()
  • Ограничить T к class, который позволяет null
  • Использование default(T), который работает для всех T значений

Здесь хотя похоже, что вы хотите использовать сложные конструкторы (те, которые принимают хотя бы один параметр) , Невозможно сделать это прямо в C#. Вместо этого вам нужен более косвенный механизм, например, делегат/лямбда или шаблон фабрики.

В этом случае, хотя похоже, что вы хотите присвоить начальное значение Datas. Учитывая, что это общедоступная собственность, наиболее вероятный подход - ничего не делать и позволить потребителю использовать инициализатор объекта для установки самого свойства. Например.

var x = new GeneralWrapper<MyType>() { 
    Datas = new MyType("hello", "world"); 
}; 

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

public GeneralWrapper(T datas) { 
    Datas = datas; 
} 
Смежные вопросы