此代码导致错误: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
不在范围内(尽管它应该是)?
答案 0 :(得分:7)
变量 index
在范围内,但as
仅允许类型:{{1} }。
所以在expr as T
中,编译器试图将asset as index.getType()
视为一种类型,而不是它,并且从不认为存在具有给定名称的变量。
尝试对运行时类型信息(例如包含在Type实例中)进行强制转换(包括使用index
)通常没有意义。为什么和替代方案,考虑
答案 1 :(得分:1)
如前所述,变量索引在范围内,但您尝试将Type对象视为Type。情况并非如此 - GetType()返回Type类的对象,用于反射。因此,也可以使用typeof()语句返回一个对象。
两者都是支持直接类型检查的关键字,它的工作方式不同,必须是直接类引用。但是,如果您愿意,可以使用表达式编译表示上述语句的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);