【问题标题】:How do you Invoke methods on ArrayList using its FieldInfo (Reflection)您如何使用其 FieldInfo(反射)调用 ArrayList 上的方法
【发布时间】:2013-01-12 19:33:30
【问题描述】:

在我的代码中,我在 ParentClass 中声明了一个 ArrayList

public class ParentClass {
...
public ArrayList hybridElem; 
...

然后使用在 ParentClass 之外运行的反射,我能够成功获取此 ArrayList @运行时的 FieldInfo。

使用该 FieldInfo,我希望能够从 hybridElem 添加或读取元素。 我能够获取 ArrayList 的所有相关 PropertyInfo,例如 .Item、.Count、.ToArray 等......并且还可以获得这些属性的 getter 和 setter。

不幸的是,它们都没有被成功调用,因为 MethodInfo.Invoke 期望 Object 引用 ArrayList

任何解决方案?

【问题讨论】:

  • 你知道 ArrayList 已经过时了吧?
  • @JohnSaunders 令人难以置信的是还有人在使用它。从 .NET 2.0 开始,这不是收集的好方法!!这已经很久很久了……
  • 不能与 COM 互操作的通用集合要好得多。除非你使用 COM。

标签: c# reflection


【解决方案1】:

你可以很容易地做到这一点。但是,正如 cmets 所说的那样,我建议您从 ArrayList 切换到通用集合。

var instance = new ParentClass();
var fieldInfo = instance.GetType().GetProperty("MyList");
var arrayList = fieldInfo.GetValue(instance) as ArrayList;
var count = arrayList.Count;

与:

public class ParentClass
{
    public ArrayList MyList { get; set; }

    public ParentClass()
    {
        MyList = new ArrayList();
    }
}

或者,使其适应使用字段的类(假设所述字段已在某处初始化):

var instance = new ParentClass();
var fieldInfo = instance.GetType().GetField("hybridElem");
var arrayList = fieldInfo.GetValue(instance) as ArrayList;
var count = arrayList.Count;

【讨论】:

  • 谢谢你的回答,约翰和夏娃!!。我只想确认一件事,当我调用 fieldInfo.GetValue(instance) 时,我将获得对数组列表的引用?通过反射,我希望能够将元素添加到 Arraylist 中。至于 ArrayList 的选择,我并没有防备,其实我并没有选择使用 ArrayList,而且我还没有完成这个项目的一个月。乍一看,我确实看到了使用 ArrayList 的优点,因为插入到 ArrayList 的对象类型不受限制,并且列表是相当不相交和动态的。
  • 我一定会抓住这一点,从 ArrayList 切换到 Generic,并得到上级的认可。
  • @user1972185 是的,GetValue 的结果将返回对 that ArrayList 的引用,而不是它的副本。
  • 哎呀!!,我弄糊涂了,因为我假设“GetValue”方法返回字段的值类型而不是对它的引用
  • @user1972185 如果答案符合您的需要,您可以通过单击答案旁边的复选标记将其标记为已选择。见:meta.stackexchange.com/questions/5234/…
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2014-11-27
  • 2011-01-13
相关资源
最近更新 更多