我有一些庞大的类,并且不想将它们全部写出来进行测试,因为这是一项巨大的工作,我会忘记一些使测试无效的值。

Messages = new List<Request.Notif.NotifRuleMessages>
{
    new Request.Notif.NotifRuleMessages
    {
        Code = 1234,
        Message = new List<Request.Notif.NotifRuleMessagesMessage>
        {
            new Request.Notif.NotifMessagesMessage
            {
                Status = new Request.Notif.NotifMessagesMessageStatus
                {
                    Code = 1,
                    Bool = true,
                    Test1 = "Test",
                    Test2 = "Test"
                },
                Rules = new List<Request.Notif.NotifMessagesMessageRule>
                {
                    new Request.Notif.NotifMessagesMessageRule
                    {
                        Lengths = new Request.Notif.NotifMessagesMessageRuleLength
                        {
                            Lenght = 1,
                            Lengths = new List<Request.Notif.NotifMessagesMessageRuleLengthLength>
                            {
                                new Request.Notif.NotifMessagesMessageRuleLengthLength
                                {
                                    Type = "Test",
                                    Value = 1
                                }
                            }
                        },
                        Status = new List<Request.Notif.NotifMessagesMessageRuleStatus>
                        {
                            new Request.Notif.NotifMessagesMessageRuleStatus
                            {
                                Test1 = "Test",
                                Test2 = "Test"




有没有一种方法可以自动用int1填充所有0值,并用string自动填充所有Test值,尤其是具有正确类的所有objects值,而无需进行单元测试和外部库?

最佳答案

使用反射,您可以递归地填充对象并设置选择的默认值。一个可以帮助您完成此任务的辅助函数的小例子:

void SetDefaults(object testObj)
{
    var props = testObj.GetType().GetProperties();
    foreach (var prop in props)
    {
        if (prop.GetSetMethod() == null)
        {
            continue;
        }

        var propType = prop.PropertyType;
        if (propType == typeof(int))
        {
            prop.SetValue(testObj, 1);
        }
        else if (propType == typeof(bool))
        {
            prop.SetValue(testObj, false);
        }
        // More conditions...
        else
        {
            var ctor = propType.GetConstructor(Type.EmptyTypes);
            var propertyObject = ctor.Invoke(new object[0]);
            SetDefaults(propertyObject);
            prop.SetValue(testObj, propertyObject);
        }
    }
}


如您所见,如果对象树使用没有默认构造函数(无参数构造函数)的类型,则在else-条件中需要一些更复杂的逻辑。基本上,这里发生的事情是依赖注入框架中发生的事情的非常简化的版本。

要使用它,请执行以下操作:

void Main()
{
    TestObject obj = new TestObject();
    SetDefaults(obj);

    Console.WriteLine(obj);
}

class TestObject {
    public int MyInt { get; set; }
    public SubTestObject SubObj { get; set; }
}

class SubTestObject {
    public int MyOwnInt { get; set; }
    public bool MyBoolGetter => 1 > 0;
}

09-25 21:06