C#'type'是一个变量,但是像类型一样使用

时间:2019-09-11 01:38:16

标签: c# reflection

此代码引发错误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。我需要将其转换为适当的类型,才能将其用作列表。

3 个答案:

答案 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

它在运行时进行评估,并返回对象的“最衍生”类型信息。就像正常功能一样。

您正试图在需要编译时类型名称的地方使用运行时变量。