为什么不将“as something.GetType()”转换为有效?

时间:2014-06-17 20:39:01

标签: c# casting

此代码导致错误: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不在范围内(尽管它应该是)?

2 个答案:

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