Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在类中插入值而不显式写入它们_C#_Class_Testing_Automation - Fatal编程技术网

C# 在类中插入值而不显式写入它们

C# 在类中插入值而不显式写入它们,c#,class,testing,automation,C#,Class,Testing,Automation,我有一些很大的类,不想把它们都写出来进行测试,因为这是一项巨大的工作,我可能会忘记一些使测试无效的值 Messages = new List<Request.Notif.NotifRuleMessages> { new Request.Notif.NotifRuleMessages { Code = 1234, Message = new List<Request.Notif.NotifRuleMessagesMessage>

我有一些很大的类,不想把它们都写出来进行测试,因为这是一项巨大的工作,我可能会忘记一些使测试无效的值

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"
Messages=新列表
{
新建Request.Notif.NotifRuleMessages
{
代码=1234,
消息=新列表
{
新建Request.Notif.notifmessages消息
{
状态=新请求.Notif.NotifMessagesMessageStatus
{
代码=1,
Bool=true,
Test1=“Test”,
Test2=“Test”
},
规则=新列表
{
新建Request.Notif.NotifMessagesMessageRule
{
长度=新请求.Notif.NotifMessagesMessageRuleLength
{
长度=1,
长度=新列表
{
新建Request.Notif.notifmessages消息长度
{
Type=“测试”,
值=1
}
}
},
状态=新列表
{
新建Request.Notif.NotifMessagesMessageRuleStatus
{
Test1=“Test”,
Test2=“Test”


有没有一种方法可以自动用
1
0
填充所有
int
值,用
Test
填充所有
字符串
值,特别是用正确的类填充所有
对象
,而无需进行单元测试和外部lib

使用反射,可以递归地填充对象d设置您选择的任何默认值。一个帮助函数的小示例可以为您做到这一点:

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;
}

使用反射,您可以递归地填充对象,并设置您选择的任何默认值。可以为您这样做的辅助函数的一个小示例:

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;
}

为什么你认为会出现一些你认为可以接受的默认值?“DaMiNeNethIONun信徒,因为<代码> {GET;set;}也存在,这对于纯编码和帮助开发人员来说是不必要的),并且可能有一些东西来初始化完整的类(带有子类)。我认为你最好的办法是使用反射实现你自己的解决方案。我怀疑有没有一个标准的解决方案。需要注意的一点是,你的结构是否是递归的。@Xerilo我无法想象有反射的解决方案,你能给我举个例子吗?不,没有递归。为什么你认为会有什么东西存在呢St碰巧应用了你认为是可接受的默认值?@ DaMiNeNethIONEntruiver,因为<代码> {GET;set;}也存在,这对于纯编码和帮助开发人员来说是不必要的),并且可能有一些东西来初始化完整的类(带有子类)。我认为你最好的办法是使用反射实现你自己的解决方案。我怀疑有没有一个标准的解决方案。需要注意的一点是,你的结构是否是递归的。@Xerilo我无法想象有反射的解决方案,你能给我举个例子吗?不,没有递归。这太棒了!但我得到了一个答案n类为
public bool ShouldSerializeName{return Name>0;}时出错
是。我认为这是因为它不能为它设置值。不同的args count引发了一个
TargetParameterCountException
。对此的任何解决方案,web都无法帮助我。@Daniel关于
应该序列化名称
,根据您希望发生的情况,您可以检查
prop.GetSetMethod()==null
并跳过它。我不确定您为什么会看到
TargetParameterCountException
,除非其中一个类有一个类似于接受多个参数的索引器。我需要更多的上下文来解决这个问题。
应该序列化{Name}
variable标识变量
Name
是否应该由
XmlSerializer
序列化,但是我会打开它,因为它不在这个范围内:)这太棒了!但是我收到一个错误,因为类是
public bool ShouldSerializeName{return Name>0;}
是。我认为这是因为它不能为它设置值。不同的args count引发了一个
TargetParameterCountException
。对此的任何解决方案,web都无法帮助我。@Daniel关于
应该序列化名称
,根据您希望发生的情况,您可以检查
prop.GetSetMethod()==null
并跳过它。我不确定您为什么会看到
TargetParameterCountException
,除非其中一个类有一个类似于接受多个参数的索引器。我需要更多的上下文来解决这个问题。
应该序列化{Name}
variable标识变量
Name
是否应该由
XmlSerializer
序列化,但我会打开它,因为它不在