powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, struct
11 сообщений из 36, страница 2 из 2
Наследование, struct
    #38770480
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все эти type constraints и прочие наследования, абстрактнось и виртуальность влияют только на методы экземпляра, но не на методы типа.
...
Рейтинг: 0 / 0
Наследование, struct
    #38770493
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что только либо через рефлексию, либо так .
...
Рейтинг: 0 / 0
Наследование, struct
    #38770500
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать интерфейс пустым чтобы он выполнял роль маркера и оформить код примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
interface IMySerializable {}

struct S1 : IMySerializable {}
struct S2 : IMySerializable {}
struct S3 { }

static class SerializationHelper
{
	public static byte[] Serialize<T>(T val) where T : struct, IMySerializable
	{
		...
	}
	
	public static T Deserialize<T>(byte[] data) where T : struct, IMySerializable
	{
		...
	}
}


Код: c#
1.
2.
3.
4.
SerializationHelper.Serialize(new S1());
SerializationHelper.Serialize(new S2());
SerializationHelper.Serialize(new S3()); // ошибка компиляции
SerializationHelper.Serialize(10); // ошибка компиляции



user7320Вообще, непонятно, как в параметре метода указать, что тип этого параметра должен поддерживать такие-то СТАТИЧЕСКИЕ методы.
Никак.
...
Рейтинг: 0 / 0
Наследование, struct
    #38770514
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileМожно сделать интерфейс пустым чтобы он выполнял роль маркера и оформить код примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
interface IMySerializable {}

struct S1 : IMySerializable {}
struct S2 : IMySerializable {}
struct S3 { }

static class SerializationHelper
{
	public static byte[] Serialize<T>(T val) where T : struct, IMySerializable
	{
		...
	}
	
	public static T Deserialize<T>(byte[] data) where T : struct, IMySerializable
	{
		...
	}
}


Код: c#
1.
2.
3.
4.
SerializationHelper.Serialize(new S1());
SerializationHelper.Serialize(new S2());
SerializationHelper.Serialize(new S3()); // ошибка компиляции
SerializationHelper.Serialize(10); // ошибка компиляции


Нет, что-то не то у вас.

У меня УЖЕ ЕСТЬ методы сериализации и десериализации для всех моих структур. И эти методы выполняются по-разному для каждой такой структуры. Они только имеют одинаковую сигнатуру. Теперь мне надо сделать одинаковые дествия, включая вызов метода Serialize, например, в другом методе другого класса. Т. е. примерно так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private byte[] SendData(Struct1 obj)
{
    byte[] result = Struct1.Serialize();
    
    // Что-то делаем с result...
    
    return result;
}

private byte[] SendData(Struct2 obj)
{
    byte[] result = Struct2.Serialize();
    
    // Что-то делаем с result...
    
    return result;
}



И я хочу, чтобы весь одинаковый (кроме вызовов Serialize) код был не разбросан по куче перегрузок метода SendData, а как-то обобщён в одном методе.
...
Рейтинг: 0 / 0
Наследование, struct
    #38770517
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка, везде

StructN.Serialize();

заменить на

StructN.Serialize(obj);
...
Рейтинг: 0 / 0
Наследование, struct
    #38770521
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private byte[] SendData(Struct1 obj)
{
    byte[] result = Struct1.Serialize(obj);
    
    // Что-то делаем с result...
    
    return result;
}

private byte[] SendData(Struct2 obj)
{
    byte[] result = Struct2.Serialize(obj);
    
    // Что-то делаем с result...
    
    return result;
}
...
Рейтинг: 0 / 0
Наследование, struct
    #38770526
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, я туплю )))

Вот же!

private byte[] SendData(byte[] structAsBytes)
...
Рейтинг: 0 / 0
Наследование, struct
    #38770530
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но штука в том, что хотелось бы именно ограничить, чтобы на вход SendData приходили данные только от определённого списка структур.
...
Рейтинг: 0 / 0
Наследование, struct
    #38771523
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  public interface IMarker
        { }
        public struct Struct1:IMarker
        {
            public static byte[] Serialize(Struct1 s)
            {
                return new byte[0];
            }
        }
        static byte[] SendData(IMarker stru)
        {
           var res = stru.GetType().InvokeMember("Serialize", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static| System.Reflection.BindingFlags.InvokeMethod, null, null, new object[] { stru });
           return res as byte[];
        }


Код: c#
1.
2.
3.
4.
5.
6.
   static void Main(string[] args)
        {
            Struct1 s = default(Struct1);
            var res = SendData(s);
            Console.ReadLine();
        }
...
Рейтинг: 0 / 0
Наследование, struct
    #38771588
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  public interface IMarker
        { }
        public struct Struct1:IMarker
        {
            public static byte[] Serialize(Struct1 s)
            {
                return new byte[0];
            }
        }
        static byte[] SendData(IMarker stru)
        {
           var res = stru.GetType().InvokeMember("Serialize", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static| System.Reflection.BindingFlags.InvokeMethod, null, null, new object[] { stru });
           return res as byte[];
        }


Код: c#
1.
2.
3.
4.
5.
6.
   static void Main(string[] args)
        {
            Struct1 s = default(Struct1);
            var res = SendData(s);
            Console.ReadLine();
        }


Ну, что через рефлексию можно - это-то понятно. Хотелось бы без неё, средствами чисто языка, без "хаков".

Всё равно спасибо за конкретный пример.
...
Рейтинг: 0 / 0
Наследование, struct
    #38772287
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, вот еще конкретный пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public interface IMySerializable<T> where T : struct, IMySerializable<T>
{
	byte[] Serialize();
	T Deserialize(byte[] data);
}

struct S1 : IMySerializable<S1>
{
	public byte[] Serialize()
	{
		...
	}
	
	public S1 Deserialize(byte[] data)
	{
		...
	}
}

public void SendData<T>(T toSend)
	where T : struct, IMySerializable<T>
{
	byte[] data = toSend.Serialize();
	SendData(data);
}

private void SendData(byte[] data)
{
}

....

S1 s1 = new S1();
SendData(s1); // ok
SendData(DateTime.Now); // ошибка компиляции
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, struct
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]