Генерик класс

jenya7
Дата: 11.06.2014 10:19:39
Есть класс
class Record
{
    public int ID {get; set;}
    public string Name {get; set;} 
}


я хочу передать тип в генерик класс
class Program
    {
        static Record rec;

        static void Main(string[] args)
        {
            rec = new Record { ID = 10, Name = "BST" };
            Type t =  rec.ID.GetType();
            Test<t> test = new Test<t>;  //тут ошибка
        }

        class Test<T>
        {
        }
    }


Получаю: The type or namespace name 't' could not be found (are you missing a using directive or an assembly reference?)
понятно, что где то туплю, вопрос где?
Arm79
Дата: 11.06.2014 10:38:09
а что, Test<Record> перестало подходить? Или нужно динамическое создание? Тогда смотрите MakeGenericType
Roman Mejtes
Дата: 11.06.2014 10:56:16
на сколько я помню из с++, генерик классы это не классы в которые можно передать тип класса, а классы которые будут сгенерированы прекомилятором перед компилицией с нужными типами. Не уверен, что в C# так же всё 1 в 1, но принцип тот же.

что мешает передавать в класс который вы создаете Type через конструктор?
и использовать Object класс для передачи значений?
Arm79
Дата: 11.06.2014 11:24:56
    public class Record
    {
        public int Id { get; set; }
        public string Text { get; set; }
    }
    public class Test<T> where T: new()
    {
        public T Value { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Record rec = new Record() {Id = 100, Text = "Text"};

            Test<Record> tst = new Test<Record>() {Value = rec};

            Console.WriteLine("{0}:{1}", tst.Value.Id, tst.Value.Text);
            Console.ReadLine();
        }
    }
jenya7
Дата: 11.06.2014 11:30:03
спасибо за пример, буду пробовать.
Где-то в степи
Дата: 11.06.2014 15:44:42
jenya7,
можно использовать вот такой выкрутас, для генерации типа когда дженерик параметр имеет произвольный тип.
 public class Record
    {
        public int Id { get; set; }
        public string Text { get; set; }
    }
    public class Test<T>
    {
        public T Value { get; set; }
    }

    class Program
    {
        static Test<T> Factory<T>(T t) 
        {
            return new Test<T> {Value = t};
        }
        
        static void Main(string[] args)
        {
            Record rec = new Record() { Id = 100, Text = "Text" };

            var tst = Factory(rec);

            Console.WriteLine("{0}:{1}", tst.Value.Id, tst.Value.Text);
            Console.ReadLine();
        }
    }
jenya7
Дата: 11.06.2014 17:54:49
я вдруг осознал насколько я слабый программист, сколько еще учить и учить. :))