public struct volt_struct
{
public string volt1;
public string volt2;
public string volt2;
public string volt3;
}
private class Injection_class
{
public volt_struct stru1;
public volt_struct stru2;
public volt_struct stru3;
public volt_struct stru4;
public volt_struct stru5;
public volt_struct stru6;
}
public void main()
{
Injection_class Time = new Injection_class();
//Here is code that fills Time with Time values as string type
string s="";
FieldInfo[] fi_inner = Time.stru1.GetType().GetFields();
FieldInfo[] fi_outer = Time.GetType().GetFields();
// This part is wrong, but shows what I want to achive.
foreach(FieldInfo field_outer in fi_outer)
{
foreach(FieldInfo field_inner in fi_inner)
{
s = string.concat(s+field_outer.field_inner.GetValue(Time) + ";");
}
}
}
我想使用反射将Time中存储的字符串连接到字符串s中。稍后我必须修改类和结构,我不想调整连接代码。
我为类中的每个结构使用foreach循环得到了我想要的结果。
foreach (FieldInfo field in fi_inner)
{
s = string.Concat(s + field.GetValue(Time.stru1) + ";");
//field.SetValue(Time, "not measured"); //reset value
}
foreach (FieldInfo field in fi_inner)
{
s = string.Concat(s + field.GetValue(Time.stru2) + ";");
//field.SetValue(Time, "not measured"); //reset value
}
//and so one for each other struct
我想在我给出的第一个例子中实现它。 这可能吗?
答案 0 :(得分:1)
如果没有反思,你可以更容易地做到这一点。像这样改变结构和类:
procedure TForm1.btn1Click(Sender: TObject);
var
params: TStringList;
begin
httpclient1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36';
httpclient1.Request.ContentType := 'multipart/form-data';
params := TStringList.Create;
try
params.add('{"content": "Test", "username": "testname", "avatar_url": "https://i.imgur.com/ivUiaOr.png"}');
finally
httpclient1.Post('https://discordapp.com/api/webhooks/443763508073594880/r8Oba0ws7WeN-n57TeF6BF6CKFFjviov6XMrMVVDUY_G18zmmY7VUwZqCiAOs9nz-CyC', params);
params.Free;
end;
end;
现在你可以使用漂亮,方便的数组:
public struct volt
{
private string[] _volts = new string[4];
public string[] volts {get {return _volts;} }
public string volt1 {
get {return _volts[0];}
set {_volts[0] = value;}
}
public string volt2 {
get {return _volts[1];}
set {_volts[1] = value;}
}
public string volt3 {
get {return _volts[2];}
set {_volts[2] = value;}
}
public string volt4 {
get {return _volts[3];}
set {_volts[3] = value;}
}
}
private class Injection
{
private _volt[] = new volt[5];
public volt[] {get {return _volt;} }
public volt stru1 {
get {return _volt[0];}
set {_volt[0] = value;}
}
public volt stru2 {
get {return _volt[1];}
set {_volt[1] = value;}
}
public volt stru3 {
get {return _volt[2];}
set {_volt[2] = value;}
}
public volt stru4 {
get {return _volt[3];}
set {_volt[3] = value;}
}
public volt stru5 {
get {return _volt[4];}
set {_volt[4] = value;}
}
public volt stru6 {
get {return _volt[5];}
set {_volt[5] = value;}
}
}
答案 1 :(得分:0)
对'field_inner'进行操作的FieldInfo属性需要引用'volt_struct'类型的对象,因此Time在此处不起作用。你需要先在'field_outer'上做一个GetValue,有点像这样:
foreach(FieldInfo field_outer in fi_outer)
{
var outer_object = field_outer.GetValue(Time);
if (outer_object == null) throw someexception;
foreach (FieldInfo field_inner in fi_inner)
{
s = string.concat(s+field_inner.GetValue(outer_object) + ";");
}
}
如果要更改父类型和子类型,可以将它们作为System.Type参数传递,或者可以编写具有两个类型参数的通用函数。您也可以将'fi_inner ='移动到外部循环中并执行fi_inner = outer_object.GetType()。GetFields()。这将连接任何类型的任何子对象上的字符串。