为什么不'工作
本文关键字:工作 为什么不 | 更新日期: 2023-09-27 18:09:06
这段代码导致一个错误:type or namespace "index" could not be found
.
foreach (var index in Model.UserAssets.Keys)
{
foreach (var asset in Model.UserAssets[index])
{
var val = asset as index.getType();
}
}
为什么这个不行?是因为index
不在范围内(尽管它应该在)吗?
变量 index
在作用域中是,但是as
只有允许Type: expr as T
。
因此,在asset as index.getType()
中,编译器试图将index
视为类型,而它不是,并且甚至从未考虑存在具有给定名称的变量。
试图对运行时类型信息进行强制转换(包括使用as
),例如包含在type实例中的类型信息,通常是没有意义的。至于为什么和其他选择,请考虑
- 将基类引用转换为其实际类型
- 如何将对象转换为类型类描述的类型?
- 如何将对象值转换为类型值?
- 将变量强制转换为类型并调用方法
如前所述,变量索引在作用域中,但您试图将Type对象视为Type。事实并非如此——GetType()返回Type类的对象,用于反射。这样的对象也可以使用typeof()语句返回。
is和as都是支持直接类型检查的关键字,它们的工作方式不同,必须是直接类引用。但是,如果您愿意,您可以使用Expressions编译一个表示上述语句的lambda,其中它将在运行时动态构建您的语句。
using System.Linq.Expressions;
...
if(index.GetType().IsAssignableFrom(asset.GetType())) return; // This will prevent an InvlaidCatException
var param = Expression.Parameter(asset.GetType());
var exp = Expression
.Convert(
param,
index.GetType());
var del = Expression.Lambda(exp, param).Compile();
var val = del.DynamicInvoke(index);