Поля Expression Bodied (только для чтения) в структурах не копируются с помощью Reflection - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь реализовать сервис глубокого / поверхностного клонирования объектов с помощью Reflection.Использование функции Clone<T> Простой класс копируется со всеми обязательными полями, но в случае поля SimpleStruct Computed поле не копируется.

В чем разница между struct и class при определении полей только для чтения и как это можно решить?

Заранее спасибо.

public T Clone<T>(T source)
{
    var obj = Activator.CreateInstance<T>();
    var type = source.GetType();

    foreach (var property in type.GetProperties())
    {
        if (!property.IsValid())
            continue;

        if (property.SetMethod != null)
        {
            property.SetValue(obj, property.GetValue(source));
        }
    }

    foreach (var field in type.GetFields())
    {
        if (field.IsPublic == false || !field.IsValid())
            continue;

        field.SetValue(obj, field.GetValue(source));
    }

    return obj;
}

public struct SimpleStruct
{
    public int I;
    public string S { get; set; }
    [Cloneable(CloningMode.Ignore)]
    public string Ignored { get; set; }

    public string Computed => S + I;

    public SimpleStruct(int i, string s)
    {
        I = i;
        S = s;
        Ignored = null;
    }
}

public class Simple
{
    public int I;
    public string S { get; set; }
    [Cloneable(CloningMode.Ignore)]
    public string Ignored { get; set; }
    [Cloneable(CloningMode.Shallow)]
    public object Shallow { get; set; }

    public string Computed => S + I + Shallow;
}
...