此代码引发错误C# 'type' is a variable but is used like a type
Type type = Type.GetType("Objects.Camera");
for (int i = 0; i < ((List<type>)currentObject).Count; i++)
{
//...
}
currentObject是通过.GetValue(object)
获得的,类型为object。我需要将其转换为适当的类型,才能将其用作列表。
答案 0 :(得分:1)
find_library
是引发异常的部分,您创建了一个名为 type 的变量来保存有关特定类型的信息,并尝试将变量用作类型
列表<>需要类型,而不是变量!
答案 1 :(得分:1)
如果现在知道该类型,则在编译时,将其强制转换:
var list = (List<Objects.Camera>)currentObject;
但是,我怀疑类型实际上来自运行时值,因此您无法进行强制转换。在这种情况下,您很不走运:您无法仅将其强制转换为正确的值,因为强制转换要求在编译时就知道类型。
根据您要实现的目标,您可以一直使用反射:
var countProperty = currentObject.GetType().GetProperty("Count");
var count = (int)countProperty.GetValue(currentObject);
for(int i = 0; i < count; ++i)
{
// ...
}
但是,如果您实际上想对该列表做任何有用的事情,那可能会变得很笨拙,因为对其执行的每个操作都需要使用反射API,这会使整个代码的可读性,可维护性降低,并且速度也变慢。
或者,您可以使用dynamic
,这样可以减少麻烦,但是它仍然很慢,并且仍然失去类型安全性。
所以让我们备份一下。也许您只想列举您的清单?那么,既然您知道您的对象是某种List,则意味着它实现了几个可以使用的非通用接口:
var list = (IList)currentObject;
for (int i = 0; i < list.Count; i++)
{
var item = list[i];
// alternatively, cast currentObject to IEnumerable and use a foreach
}
这样,我们解决了枚举集合的问题,但没有实际使用其内容,因为上面的item
仍然是一个对象。您将必须找到解决该问题的方法,因为没有通用的方法可以解决该特定问题,因为这取决于您要实现的价值。
希望有帮助!
答案 2 :(得分:0)
C#object.GetType()
在c ++中的工作方式不像decltype
。
它在运行时进行评估,并返回对象的“最衍生”类型信息。就像正常功能一样。
您正试图在需要编译时类型名称的地方使用运行时变量。