class MyClacc<IType>
{
IType _myObj;
SaveToFile(string fileName)
{
BinaryWriter binaryWriter = new BinaryWriter(new FileStream(fileName, FileMode.OpenOrCreate));
binaryWriter.Write(_myObj);
binaryWriter.Close();
}
}
Generic типы
Или хотя бы как-нить привести тип... Потому что в бинарный файл объект типа абстрактного IType не пишется.
Код:
Цитата: 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);
}
}
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);
}
}