Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Generic типы

10K
23 июня 2010 года
Cybernetic
106 / / 22.07.2009
Хочу создать свой тип, generic, чтобы типы могли приниматься только значимые, например UInt32, Int16, и так далее. Можно ли это сделать при помощи ограничения типов where-клаузой?

Или хотя бы как-нить привести тип... Потому что в бинарный файл объект типа абстрактного IType не пишется.
Код:
class MyClacc<IType>
{
      IType _myObj;

      SaveToFile(string fileName)
      {
            BinaryWriter binaryWriter = new BinaryWriter(new FileStream(fileName, FileMode.OpenOrCreate));

            binaryWriter.Write(_myObj);

            binaryWriter.Close();
      }
}
5
23 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Cybernetic
Хочу создать свой тип, generic, чтобы типы могли приниматься только значимые, например UInt32, Int16, и так далее. Можно ли это сделать при помощи ограничения типов where-клаузой?


Нельзя, но можно добавить ограничение where T: struct и тогда ваш тип может инстанциироваться только типами-значениями.
Для записи в поток ваши структуры можно сериализовать в массив byte[] с помощью Marshal.StructureToPtr.

Пример:

Код:
using System;
using System.IO;
using System.Runtime.InteropServices;

class MyClass<T> where T: struct {

    static int t_size = Marshal.SizeOf(typeof(T));

    public MyClass(T value) {
        this.Value = value;
    }

    public T Value { get; private set; }

    public unsafe void SaveToFile(string fileName) {
        using(var file = new FileStream(fileName, FileMode.Create, FileAccess.Write)) {
            var buffer = new byte[t_size];
            fixed(byte* p_buffer = buffer)
                Marshal.StructureToPtr(Value, new IntPtr(p_buffer), true);
            file.Write(buffer, 0, buffer.Length);
        }
    }
}

class Program
{
    public static void Main(string[] args)
    {
        var x = new MyClass<int>(10);
        x.SaveToFile("x.bin");

        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог