我有以下代码:
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(或其中某些转换)上使用intellisense。
由于
编辑: 对不起,我可能不正确地问了。我理解什么是动态和var。 我并不打算在动态上使用intellisense。 我并不打算真正将动态转换为var。
我想说的是,如果我有编译时知道动态将是什么类型(它存储在Query实现中 - 它可以是静态的,const我想要的任何东西) - 我有什么方法可以使用这些知识在ProcessItem()中启用intellisense?
答案 0 :(得分:4)
var
上下文关键字只是语法糖。没有必要对其进行“强制转换”,因为用它声明的变量已经是强类型的。
如果函数结果的类型是dynamic
,那么用var
声明的变量也是如此。
staticResult
的类型为dynamic
:
var staticResult = dynamicResult;
您无法在dynamic
类型上获得智能感知。如果您知道您将获得的类型,然后投射到它 - 这将使您能够访问intellisense。
var staticResult = (myType)dynamicResult;
请注意,上述内容很容易导致运行时错误和异常,从而导致进程崩溃。
答案 1 :(得分:2)
请参阅this SO answer详细解释var
和dynamic
之间的区别,根据您的问题,您应该知道编译器会知道var
的类型在编译时,dynamic
只能在运行时确定;因此,您无法将从dynamic
(在运行时确定)的类型转换为var
(在编译时确定)。
那么,为什么不让它保持动态呢?
答案 2 :(得分:2)
不,你不能做那样的事。
首先,由于var
不是类型,因此无法向var
投射内容。此外,铸造只能用于静态知道的类型;这意味着您要转换的类型必须是硬编码的,并且不能是评估表达式的结果(例如示例中的方法调用_query.GetSomeType()
)。
答案 3 :(得分:1)
你可以实现像
这样的东西public abstract class AbstractQuery
{
AbstractQuery Create(dynamic result);
}
public class SpecificQuery1 : AbstractQuery
{
new public SpecificQuery1 Create(dynamic result)
{
...
}
}
public void ProcessItem(dynamic dynamicResult)
{
var staticResult = _query.Create(dynamicResult);
}
从动态转换为类型化结果