c # Преобразование структуры в другую структуру

Есть ли способ, как конвертировать это:

namespace Library
{
    public struct Content
    {
        int a;
        int b;
    }
}

У меня есть структура в Library2.Content, который имеет данные, определенные таким же образом ({ int a; int b; }), но разными методами.

Есть ли способ преобразовать экземпляр структуры из Library.Content в Library2.Content? Что-то вроде:

Library.Content c1 = new Library.Content(10, 11);
Library2.Content c2 = (Libary2.Content)(c1); //this doesn't work

Ответы на вопрос(3)

Решение Вопроса

Вы можете определить явный (или неявный) оператор преобразования из одного типа в другой. Обратите внимание, что это подразумевает, что одна библиотека (та, которая определяет оператор преобразования) должна принимать зависимость от другой.Вы можете определить свой собственный служебный метод (возможно, метод расширения), который преобразует один тип в другой. В этом случае ваш код для преобразования должен был бы измениться, чтобы вызвать вспомогательный метод, а не выполнять приведение.Вы могли бы просто новыйLibrary2.Content и передать значения вашегоLibrary.Content конструктору.

Вы можете определить явноеоператор преобразования внутриLibrary2.Content следующее:

// explicit Library.Content to Library2.Content conversion operator
public static explicit operator Content(Library.Content content) {
    return new Library2.Content {
       a = content.a,
       b = content.b
    };
}
 Bertrand Marron26 сент. 2010 г., 19:21
Затем перейдите ко второму или третьему варианту @Kent Boogaart.
 Perry26 сент. 2010 г., 19:19
Проблема в том, что у меня нет доступа внутри библиотеки2 и в библиотеке1 я не знаю о существовании библиотеки2

есть другой способ сделать это, если расположение типов данных одинаково - с помощью маршалинга.

static void Main(string[] args)
{

    foo1 s1 = new foo1();
    foo2 s2 = new foo2();
    s1.a = 1;
    s1.b = 2;

    s2.c = 3;
    s2.d = 4;

    object s3 = s1;
    s2 = CopyStruct<foo2>(ref s3);

}

static T CopyStruct<T>(ref object s1)
{
    GCHandle handle = GCHandle.Alloc(s1, GCHandleType.Pinned);
    T typedStruct = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    handle.Free();
    return typedStruct;
}

struct foo1
{
    public int a;
    public int b;

    public void method1() { Console.WriteLine("foo1"); }
}

struct foo2
{
    public int c;
    public int d;

    public void method2() { Console.WriteLine("foo2"); }
}
 nurchi15 сент. 2018 г., 07:23
Хаха, я просто собирался написать буквально одно и то же :)
 C.Evenhuis26 сент. 2017 г., 13:25
Аналогично, если вы разрешите небезопасный код:foo2 s2 = *(foo2*)&s1;

Ваш ответ на вопрос