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
序列化,但我会打开它,因为它不在