当我只能访问其对象时,如何将项目添加到列表中
本文关键字:项目 添加 列表 访问 对象 | 更新日期: 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> objectOfList
或 Object objectOfList = new List<Object>();
,您将不会获得空引用。
Object objectOfList = new List<object>();
(objectOfList as List<object>).Add(5);
(示例小提琴)
尝试将对象列表转换回原来的样子。 如果它是一个列表,那么:
List lo = ((List)objectOfList)
这样,您就可以使用列表。然后,您可以通过此方法找出它是哪种类型的列表:
objectOfList.ToString() 或 objectOfList.GetType().ToString()