当我只能访问其对象时,如何将项目添加到列表中

本文关键字:项目 添加 列表 访问 对象 | 更新日期: 2023-09-27 18:33:42

在我的应用程序中,我有一个使用反射从另一个程序集创建的泛型列表。我只能访问该列表的对象。我的意思是我有一个Object objectOfList我知道它是一个通用的值列表(例如 int 或浮点值)。我需要将项目添加到此列表中。我该怎么做?

由于我不知道通用列表的类型是什么,我试图将objectOfList转换为对象列表,但它抛出了一个异常:

(objectOfList as List<object>).Add(value); // value is an integer here

它引发空引用异常。

更新

它可以是int float或任何其他类型。当我编写代码时,我不知道类型是什么。这是从UI中选择列表类型的用户,然后创建列表。

当我只能访问其对象时,如何将项目添加到列表中

正如 Lee 指出的,您必须使用实际类型而不是object 。请考虑以下事项:

object someList = new List<int>();
(someList as List<object>).Add(1);

这将抛出一个NullReferenceException但是

(someList as List<int>).Add(1);

不。

有关as的更多信息:

as 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而不是引发异常

作为(C# 参考)

您还可以尝试一件事,那就是通过使用非泛型接口IList失去List<T>的泛型类型安全支持。这将允许您做您想做的事,但如果类型不同,则会抛出System.ArgumentException

(someList as IList).Add(1); //ok
(someList as IList).Add("hello");  //throws exception

List 是不变的,因此您只能将其转换回具有相同元素类型的列表,例如

int value = 4;
object source = new List<int>();
((List<int>)source).Add(value);

如果你知道元素类型总是与value的类型匹配,并且你知道静态value的类型,那么你就可以强制转换。

如果您知道列表元素类型可能是value的超类型,那么您可以调用IList.Add,这仍然是安全的,例如

object source = new List<Animal>();
var g = new Giraffe();
((IList)source).Add(g);

请注意,在这种情况下,您无法将source转换为List<Giraffe>

如果您不知道静态类型的value那么还必须强制转换为IList并准备好在调用Add时处理异常。

>Object objectOfList不能强制转换为List<object>因此as运算符返回 null。

如果您将其初始化为 List<Object> objectOfListObject objectOfList = new List<Object>();,您将不会获得空引用。

    Object objectOfList = new List<object>();
    (objectOfList as List<object>).Add(5); 

(示例小提琴)

尝试将对象列表转换回原来的样子。 如果它是一个列表,那么:

List lo = ((List)objectOfList)

这样,您就可以使用列表。然后,您可以通过此方法找出它是哪种类型的列表:

objectOfList.ToString() 或 objectOfList.GetType().ToString()