在 ArrayList 中获取对象的属性值

本文关键字:属性 取对象 获取 ArrayList | 更新日期: 2023-09-27 18:28:04

我已经在 C# 中为 Windows 窗体应用程序初始化了一个ArrayList。我正在添加新对象,这些对象在ArrayList中每个对象的属性很少,例如:

ArrayList FormFields = new ArrayList();
CDatabaseField Db = new CDatabaseField();
Db.FieldName = FieldName; //FieldName is the input value fetched from the Windows Form
Db.PageNo = PageNo; //PageNo, Description, ButtonCommand are also fetched like FieldName
Db.Description = Description;
Db.ButtonCommand = ButtonCommand;
FormFields.Add(Db);

现在,当我只想检查ArrayList中每个对象的FieldName时(假设ArrayList中有许多对象(。我该怎么做??

我试过了:

for(int i=0; i<FormFields.Count; i++) 
{
    FieldName = FormFields[i].FieldName;
}

但这会产生错误(在 IDE 中(。我是C#编程的新手,所以有人可以帮助我吗?

错误

:错误 21"对象"不包含"字段名称"的定义 并且没有扩展方法"字段名称"接受类型的第一个参数 可以找到"对象"(您是否缺少使用指令或 程序集引用?

在 ArrayList 中获取对象的属性值

ArrayList保存对象。它不是通用的,并且类型安全。这就是为什么您需要强制转换对象以访问其属性的原因。相反,请考虑使用通用集合,例如 List<T> .

var FormFields = new List<CDatabaseField>();
CDatabaseField Db = new CDatabaseField();
...
FormFields.Add(Db);

然后,您可以看到所有属性都将可见,因为现在编译器知道元素的类型,并允许您以类型安全的方式访问类型的成员。

终于找到了答案。我尝试为保存在 arraylist 中的每个对象强制转换对象,最终可以获取每个对象的必填字段:

for (int i = 0; i < FormFields.Count; i++)
{
     CDatabaseField Db = (CDatabaseField)FormFields[i];
     Label1.Text = Db.FieldName; //FieldName is the required property to fetch
}

正如已经指出的,并基于此:

Item 返回一个Object,因此您可能需要强制转换返回的值 到原始类型以对其进行操作。重要的是 请注意,ArrayList 不是强类型集合。对于一个 强类型替代项,请参见List<T>

但是,作为另一种选择,您可以使用foreach循环而不是for 。当foreach运行时,它会尝试将ArrayList的元素cast CDatabaseField,如果元素不可转换为CDatabaseField,您将获得InvalidCastException

foreach (CDatabaseField item in FormFields)
{
    FieldName = item.FieldName;
}

根据foreach文档和 C#6 语法,上面的代码等效于以下内容:

var enumerator = FormFields.GetEnumerator();
try
{
    while (enumerator.MoveNext())
    {
        CDatabaseField item = (CDatabaseField)enumerator.Current;
    }
}
finally
{
    var disposable = enumerator as IDisposable;
    disposable?.Dispose();
}