jeudi 4 juillet 2019

How to generate an object that has all the Properties of another, only Nullable (when applicable)?

I am creating a project that will manage app configurations. It will be very generic, reusable across different apps (with different config models on each) and very flexible - including the ability to receive partial configurations from multiple sources.

Without getting too much into details, here's an example of what I need to do.
I have a class like below:

public class TestConfigModel
{
    public int SomeIntValue { get; set; }
    public string SomeStringValue { get; set; }
    public TestConfigSubsection Subsection { get; set; }
}

public class TestConfigSubsection
{
    public System.DayOfWeek SomeSubsectionEnumValue { get; set; }
    public Guid SomeSubsectionGuidValue { get; set; }
}

Which is used to create a default (complete) config like so:

var aConfigInstance = new TestConfigModel()
{
    SomeIntValue = 3,
    SomeStringValue = "hey",
    Subsection = new TestConfigSubsection()
    {
        SomeSubsectionEnumValue = DayOfWeek.Thursday,
        SomeSubsectionGuidValue = Guid.Parse("{2C475019-5AAC-43C6-AC87-21947A40E3B7}")
    }
};

Now, I need to be able to create, serialize, store and later deserialize and see a partial configuration model, like below:

var aPartialConfigInstance = new TestConfigModelNullable()
{
    SomeIntValue = 4,
    Subsection = new TestConfigSubsection()
    {
        SomeSubsectionEnumValue = DayOfWeek.Monday
    }
};

... with all missing properties null. If I try to do the same with the original class, all the other non-nullable fields will receive default values and that would be bad (how do I tell if int value of 0 is intended or not? Maybe it makes sense...).

To my understanding, I need to dynamically generate a version of this model that has all properties nullable (unless they already take a null):

public class TestConfigModelNullable
{
    public int? SomeIntValue { get; set; }
    public string SomeStringValue { get; set; } // already takes a null
    public TestConfigSubsection Subsection { get; set; } // already takes a null
}

public class TestConfigSubsectionNullable
{
    public System.DayOfWeek? SomeSubsectionEnumValue { get; set; }
    public Guid? SomeSubsectionGuidValue { get; set; }
}

However, I'm new to reflection in general and not sure how to approach this. Your help would be much appreciated :)

Recall that we don't know the model ahead of time.





Aucun commentaire:

Enregistrer un commentaire