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

Mic*_*ich 7 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++)
{
 //...
}
Run Code Online (Sandbox Code Playgroud)

currentObject 是通过.GetValue(object)并具有类型 object 获得的。我需要将其转换为正确的类型才能将其用作列表。

Eti*_*tel 4

如果该类型现在在编译时已知,则只需对其进行强制转换:

\n\n
var list = (List<Objects.Camera>)currentObject;\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,我怀疑该类型实际上来自运行时值,因此您无法对其进行强制转换。在这种情况下,你就不走运了:你无法强制转换为正确的值,因为强制转换要求在编译时知道类型。

\n\n

根据您想要实现的目标,您可以一直使用反射:

\n\n
var countProperty = currentObject.GetType().GetProperty("Count");\nvar count = (int)countProperty.GetValue(currentObject);\n\nfor(int i = 0; i\xc2\xa0< count; ++i)\n{\n    // ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,如果您想对该列表实际执行任何有用的操作,那么这可能会变得非常笨重,因为对其进行的每个操作都需要使用反射 API,这将使整个代码的可读性、可维护性较差,而且速度也较慢。

\n\n

或者,您可以使用dynamic,这会使其不那么笨重,但它仍然会很慢,并且您仍然会失去类型安全性。

\n\n

那么让我们备份一下。也许您只想枚举您的列表?那么,既然您知道您的对象是某种类型的 List,那么这意味着它实现了几个您可以使用的非通用接口:

\n\n
var list = (IList)currentObject;\nfor (int i = 0; i < list.Count; i++)\n{\n    var item = list[i];\n    // alternatively, cast currentObject to IEnumerable and use a foreach\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样,我们就解决了枚举集合的问题,但没有解决实际使用其内容的问题,因为item上面仍然是一个对象。您必须找到解决方法,因为没有解决该特定问题的通用方法,因为这取决于您想要通过该值实现的目标。

\n\n

希望有帮助!

\n