【发布时间】:2012-11-07 08:32:31
【问题描述】:
我有以下代码:
public class Processor
{
private Query _query =
new SpecificQuery1();
//OR
//new SpecificQuery2();
public void ProcessItem(dynamic dynamicResult)
{
//Can't use intellisense on dynamicResult
var staticResult = dynamicResult as _query.GetSomeType();//Can't do it :(
//Can use intellisense on staticResult
}
}
而且,令人惊讶的是,它无法编译。有什么办法可以将动态转换为var?我知道这听起来很疯狂,但这部分将被大量编辑,如果有人更改 QueryImplementation,他还必须更改 ProcessItem() 中的类型。我想将步骤数减少到 1 - 只需替换 SpecificQuery() ,类型就会自行更改。
所以让我换个说法。我想知道是否有某种方法可以根据将哪个构造函数分配给基类 Query 来在 dynamicResult(或其中一些强制转换)上使用智能感知。
谢谢
编辑: 对不起,我可能问错了。我明白什么是动态和可变的。 我不打算在动态上使用智能感知。 我并不打算真正将动态转换为 var。
我想说的是,如果我在编译时知道动态将是什么类型(它存储在 Query 实现中 - 它可以是静态的,我想要的任何 const ) - 有什么办法可以吗?使用这些知识在 ProcessItem() 中启用智能感知?
【问题讨论】:
-
您应该阅读一些内容以了解 var 和 dynamic 之间的区别。
-
不,动态类型不能以您想要的方式与 Intellisense 一起使用,因为它们的属性/方法只有在运行时才能知道。您不能以这种方式转换为“var”。这真的很疯狂......但你可以这样做:“var staticResult = (SpecificQuery1)dynamicResult;”(请注意,你试图再次转换为未知类型,在运行时解决...)
-
只是为了澄清。我明白两者之间的区别。我知道我不能在动态上使用智能——我知道为什么。我总是会在编译时知道,ProcessItem 中将使用什么类型,所以我认为可能有一些方法。
-
I will know always,那为什么是dynamic? -
你上面的
as没有意义。强制转换将 compile-time 类型更改为必须知道编译时的特定类型。例如,如果你说var resultCast = resultOrig as string;,那么在那之后(以及null检查)你可以说resultCast.Length这样的东西,因为resultCast的编译时类型是string,并且字符串有长度。但是,强制转换并没有改变只有一个对象的事实,并且该对象只有一种运行时类型。Object.RefereceEquals(resultOrig, resultCast)。编译器怎么知道_query.GetSomeType()会返回什么?
标签: c# .net dynamic casting var