为什么不'工作

本文关键字:工作 为什么不 | 更新日期: 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);