gpt4 book ai didi

c# - 如何在类反射期间访问 List 值?

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:43 25 4
gpt4 key购买 nike

我是 Reflection 的新手,但已经能够检索我通过的类(class)的所有字段。现在我正在尝试检索每个字段的值,但我遇到了 List<T> 的问题.

我有一个简单的测试类:

    public class MyTestClass
{
public string Name;
public int Age;
public bool Alive;
public List<int> Counters;
public List<string> People;
public List<Tool> Tools;
public string[] Stuff;
public Tool[] NeededTools;

public MyTestClass(string name, int age, bool alive = true)
{
Name = name;
Age = age;
Alive = alive;
Counters = new List<int>();
Counters.Add(7);
People = new List<string>();
People.Add("Seven");
Tools = new List<Tool>();
Stuff = new string[2];
NeededTools = new Tool[3];
}
}

这是我使用的代码:

    private void AttachControl(object source, FieldInfo fi, Control control)
{
switch (fi.FieldType.Name)
{
case "Boolean":
(control.Controls[fi.Name] as ComboBox).SelectedIndex = (fi.GetValue(source).ToString().ToUpper() == "TRUE") ? 1 : 0;
break;
case "List`1":
Control listControl = control.Controls[fi.Name];
var listType = fi.FieldType.GetGenericArguments();

var listFields = listType[0].GetFields(
BindingFlags.Public |
BindingFlags.Instance
);
if (listFields.Length > 0)
{
AttachToControls(listFields, listControl.Controls.Cast<Control>().ToArray());
}
else
{
// *** Here is the issue ***
var values = fi.GetValue(source);
listControl.Controls[fi.Name].Text = values[0].ToString();
}
break;
default:
control.Controls[fi.Name].Text = fi.GetValue(source).ToString();
break;
}
}

当我到达 Counters 时我可以检索值 var values = fi.GetValue(source);在调试期间,我可以看到其中包含值 7 的列表,但它指出

cannot apply indexing with [] to an expression of type object on the line: listControl.Controls[fi.Name].Text = values[0].ToString();

我假设我需要转换它,但它并不总是一个 int 类型。我是否需要为每种类型编写一个部分,或者是否有更简单的方法来完成我的需要?

仅供引用 - 我正在编写一个类库,它允许我传递任何类并自动创建一个表单来编辑所有字段。

最佳答案

我的建议是:

var bob = values as IEnumerable;
listControl.Controls[fi.Name].Text = bob?.Cast<object>()?.FirstOrDefault()?.ToString();

因为你想要的是一个string (不是特定类型)那么上面的代码就可以正常工作(假设值是某种形式的可枚举,如列表或数组)。

请特别注意 IEnumerable界面是this one ,不是更常用的 IEnumerable<T> .这允许您在没有特定类型的情况下使用它。

关于c# - 如何在类反射期间访问 List<int> 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57743905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com